0
它看起来不可能从恐慌中的恐慌中恢复过来吗?是否有可能从恐慌中的恐慌中恢复过来?
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"
}
背景故事:我的错误错误()函数使用os.Getwd,这似乎总是在恐慌中恐慌,所以我想优雅地处理这个问题。
你为什么首先恐慌?你是否试图用恐慌作为例外机制?正如你所看到的,你不应该做任何可能在尝试恢复时也会恐慌的事情。 – JimB
我绝对不会使用恐慌。在我的使用中,恐慌只会因程序员错误而发生,而不是用户错误。 –
嗯,我不确定现在“测试”软件包有什么不同。试着弄清楚如何复制这个作为一个独立的例子,看看它是否是一个bug。 – JimB