检查恐慌而不从中恢复

Dan*_*yel 4 error-handling go

在延迟函数中,我想查看恢复调用是否会产生非零值(不恢复)

可能吗?

eva*_*nal 6

确切的事情是不可能的.你可能只是想重新恐慌,基本上就像在其他语言中重新抛出异常一样;

        defer func() {
             if e := recover(); e != nil {
                 //log and so other stuff
                 panic(e)
             }
          }()
Run Code Online (Sandbox Code Playgroud)

  • 堆栈跟踪不会被新的恐慌覆盖吗?**编辑**:没关系,它不是 https://play.golang.org/p/4E5hJZY_qA- (4认同)

use*_*610 5

您可以设置一个布尔标志,然后在函数体的末尾重置它。如果 defer 内部仍然设置了该标志,则您知道最后一条语句没有执行。唯一可能的原因是该函数出现恐慌。

https://play.golang.org/p/PKeP9s-3tF

func do() {
    panicking := true
    defer func() {
        if panicking {
            fmt.Println("recover would return !nil here")
        }
    }()

    doStuff()

    panicking = false
}
Run Code Online (Sandbox Code Playgroud)

缺点是增加了维护负担,panicking = false必须保留为函数体中的最后一条语句。如果函数有多个返回值,则它必须是每次返回之前的最后一条语句。