返回介绍

处理 panic

发布于 2024-10-12 12:51:55 字数 1278 浏览 0 评论 0 收藏 0

两个内置函数 panicrecover ,可以抛出和处理运行时 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 技术交流群。

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

发布评论

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