go 运行时可以检测panic(nil)
并报告错误。
但是,我无法在红色函数中检测到,因为它返回panic(nil)
,所以我无法将它与正常执行(没有恐慌)区分开来,因为我会测试返回值为nil。recover()
defer
nil
recover()
例如,
defer func(){
var err = recover()
if err != nil {
// Real serious situation. Panic from inner code.
// And we may have some critical resources which
// must be cleaned-up at any cases.
// However, this will not be executed for panic(nil)
rollback()
// I am still not sure that how should I treat `panic`…
// Should I just ignore them?
}
}()
var err = doTransaction()
if err == nil {
commit() // Happy case.
} else {
rollback() // Regular execution. Just a lucky case.
}
ROLLBACK 只是一个例子,我认为我可以有大量的关键案例需要清理。好吧,那些清理代码也不会在真正的程序崩溃时执行,但我想尽可能地捍卫。
无论延迟函数中的参数如何,我如何检测任何恐慌?