【问题标题】:Is it possible to recover from a panic inside a panic?是否有可能从恐慌中的恐慌中恢复过来?
【发布时间】: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


【解决方案1】:

我认为替换它可以解决您的问题

panic(e1)

通过这个

panic(e1.Error())

游乐场:http://play.golang.org/p/fXpX2ch9eF

这里的问题很有趣:为什么?这是困难的部分,我不知道确切的答案。可能这里的问题是我们在所有延迟函数执行后恐慌(所以当 Go 确实尝试打印恐慌错误字符串时)。如有不妥欢迎指正!

【讨论】:

  • 是的,这就是我决定的解决方法,但我希望更完整地解释为什么它不起作用......
猜你喜欢
  • 2015-10-20
  • 1970-01-01
  • 2023-02-04
  • 2022-06-27
  • 1970-01-01
  • 2019-10-07
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多