返回介绍

Panic 和 Recover

发布于 2024-10-12 12:35:54 字数 1454 浏览 0 评论 0 收藏 0

Go 没有像 Java 那样的异常机制,它不能抛出异常,而是使用了 panicrecover 机制。一定要记住,应当把它作为最后的手段来使用,也就是说,代码中应当没有,或者很少有 panic 的东西。这是个强大的工具,请明智地使用它。

Panic

是一个内建函数,可以中断原有的控制流程,进入一个 panic 状态中。当函数 F 调用 panic ,函数 F 的执行被中断,但是 F 中的延迟函数会正常执行,然后 F 返回到调用它的地方。在调用的地方, F 的行为就像调用了 panic 。这一过程继续向上,直到发生 panicgoroutine 中所有调用的函数返回,此时程序退出。 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文