【发布时间】:2016-01-16 08:14:32
【问题描述】:
看起来不可能从恐慌中的恐慌中恢复过来?
func TestError(t *testing.T) {
e := &myErr{p: false}
fmt.Println(e.Error()) // this prints "returned"
panic(e) // this prints "panic: returned"
e1 := &myErr{p: true}
fmt.Println(e1.Error()) // this prints "recovered"
panic(e1) // this prints "panic: panic: paniced
// fatal error: panic holding locks
// panic during panic"
}
type myErr struct {
p bool
}
func (m *myErr) Error() (out string) {
defer func() {
if r := recover(); r != nil {
out = "recovered"
}
}()
if m.p {
panic("paniced")
}
return "returned"
}
背景故事:我的错误 Error() 函数使用了 os.Getwd,它在恐慌时似乎总是恐慌,所以我想优雅地处理这个问题。
【问题讨论】:
-
一开始你为什么会恐慌?您是否尝试使用恐慌作为异常机制?如您所见,在尝试恢复时,您不应该做任何可能会引起恐慌的事情。
-
我绝对不会过度使用恐慌。在我的使用中,恐慌只会由于程序员错误而不是用户错误而发生。
-
嗯,我不确定“测试”包现在有什么不同。尝试弄清楚如何将其复制为独立示例以查看它是否是错误将很有用。
标签: go