文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
处理 panic
两个内置函数 panic
和 recover
,可以抛出和处理运行时 panic
和程序的错误条件。
func panic(interface{})
func recover() interface{}
当执行 F 函数时,显式的调用 panic
或者运行时 panic 都会中断 F 的执行。但是 F 中的延迟函数还会执行。接下来调用 F 函数处的延迟函数也会执行,一直到顶级的延迟函数。鉴于这点,程序关闭并且错误条件可以抛出。包括 panic
中的值。这个顺序叫做 panicking
。
panic(42)
panic("unreachable")
panic(Error("cannot parse"))
recover
函数允许程序从一个 panicking 中恢复执行。假设函数 G 延迟执行函数 D ,在 D 中调用 recover
这时如果在 G 执行时发生 panic 会在 D 中恢复。当函数执行到 D, recover
的返回值会返回 panic
对应的错误,并且终止 panicking
。在这个情况下 G 函数和 panic
之间的代码不会执行。任何在 D 中 G 之前的延迟函数会返回到调用者。
在下面两种情况下 recover
会返回 nil:
panic 的参数为 nil
携程里没有发生 panic
recover 不是在延迟函数中执行
本例中的 protect
函数会在 g 发生 panic 的时候恢复执行。
func protect(g func()) {
defer func() {
log.Println("done") // Println executes normally even if there is a panic
if x := recover(); x != nil {
log.Printf("run time panic: %v", x)
}
}()
log.Println("start")
g()
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论