文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Panic 和 Recover
Go 没有像 Java 那样的异常机制,它不能抛出异常,而是使用了 panic
和 recover
机制。一定要记住,应当把它作为最后的手段来使用,也就是说,代码中应当没有,或者很少有 panic
的东西。这是个强大的工具,请明智地使用它。
Panic
是一个内建函数,可以中断原有的控制流程,进入一个 panic
状态中。当函数 F
调用 panic
,函数 F 的执行被中断,但是 F
中的延迟函数会正常执行,然后 F 返回到调用它的地方。在调用的地方, F
的行为就像调用了 panic
。这一过程继续向上,直到发生 panic
的 goroutine
中所有调用的函数返回,此时程序退出。 panic
可以直接调用 panic
产生。也可以由运行时错误产生,例如访问越界的数组。
Recover
是一个内建的函数,可以让进入 panic
状态的 goroutine
恢复过来。 recover
仅在延迟函数中有效。在正常的执行过程中,调用 recover
会返回 nil
,并且没有其它任何效果。如果当前的 goroutine
陷入 panic
状态,调用 recover
可以捕获到 panic
的输入值,并且恢复正常的执行。
下面这个函数演示了如何在过程中使用 panic
var user = os.Getenv("USER")
func init() {
if user == "" {
panic("no value for $USER")
}
}
下面这个函数检查作为其参数的函数在执行时是否会产生 panic
:
func throwsPanic(f func()) (b bool) {
defer func() {
if x := recover(); x != nil {
b = true
}
}()
f() //执行函数 f,如果 f 中出现了 panic,那么就可以恢复回来
return
}
注意:
defer
必须在 panic
语句之前。
recover
必须配合 defer
使用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论