2 回答
TA贡献1828条经验 获得超4个赞
除非我误解了您的问题,否则延迟函数调用将在恐慌时运行,即使传递的值为nil
. 以下程序说明了这一点:
package mainimport "fmt"func main() { defer func() { fmt.Println("Recover:", recover()) }() panic(nil)}
因此,您可以panic(nil)
通过比较recover()
to返回的值来轻松检测是否发生了nil
。
编辑以回答评论:
是的,这是真的; 延迟调用通常会在函数返回时运行。但是它们也会在 .a 之后展开调用堆栈时运行panic()
。
问题更新后编辑:
您是正确的,没有办法区分这些情况。另一方面,恐慌nil
也没有多大意义——尤其是因为这个限制。
panic(nil)
我能想到的唯一用例是故意避免恢复并强制程序因堆栈跟踪而崩溃。不过,还有更优雅的方法可以做到这一点,runtime
例如使用包。
TA贡献1796条经验 获得超10个赞
我可以在退出前设置一个标志。
AFAIK,panic 是特定于 goroutine 的,并且单个 goroutine 保证在单线程中。因此,不需要在 variable 周围进行同步/锁定ok。如果我错了,请纠正我。
func clean(ok *bool) {
if *ok {
log.Printf("Execution OK. No panic detected.\n")
} else {
var reason = recover()
log.Printf("Some bad thing happen. reason = %v\n", reason)
panic("Abnormal exit. Program abandoned. Stack-trace here.")
debug.PrintStack() // Oops. this will not run.
}
}
func main() {
var ok bool = false
defer clean(&ok)
panic(nil)
test1() // Here's the main job.
ok = true
log.Printf("All work done. Quit gracefully.\n")
}
- 2 回答
- 0 关注
- 298 浏览
添加回答
举报