返回介绍

02.7 Panic 和 Recover

发布于 2024-08-14 12:50:32 字数 4444 浏览 0 评论 0 收藏 0

Panic和Recover

​ 本节将向您介绍第1章“Go和操作系统”中首次提到的技术。这种技术涉及使用 panic()recover() 函数,代码在 panicRecover.go 中,将分三部分进行讨论。

​ 严格来说, panic() 是一个内置的Go函数,它终止Go程序的当前流程并开始 panicking ! 另一方面, recover() 函数也是一个内置的Go函数,允许你收回那些使用了 panic() 函数的 goroutine 的控制权。

第一部分的程序如下:

> package main
> import (
>     "fmt"
> )
> func a() {
>     fmt.Println("Inside a()")
>     defer func() {
>         if c := recover(); c != nil {
>             fmt.Println("Recover inside a()!")
>            }
>     }()
>     fmt.Println("About to call b()")
>     b()
>     fmt.Println("b() exited!")
>     fmt.Println("Exiting a()")
> }

除了import语句块,这部分代码实现了一个函数 a() ,这个函数最重要的部分是 defer 代码块,它实现了一个匿名函数,当 panic() 函数被调用的时候,这个匿名函数就会被调用。

第二部分的代码:

> func b() {
>     fmt.Println("Inside b()")
>     panic("Panic in b()!")
>     fmt.Println("Exiting b()")
> }

最后一部分代码解释了 panic()recover() 函数:

> func main() {
>     a()
>     fmt.Println("main() ended!")
> }

执行完整的代码,会得到如下的输出:

> $ go run panicRecover.go
> Inside a()
> About to call b()
> Inside b()
> Recover inside a()!
> main() ended!

这里发生的事真的令人印象深刻! 但是,正如您从输出中看到的那样,a函数没有正常结束,因为它的最后两个语句没有执行:

> fmt.Println("b() exited!")
> fmt.Println("Exiting a()")

然而,好消息是 panicRecover.go 根据我们的意愿结束而没有 panicking ,因为 defer 中使用的匿名函数控制了局面! 另请注意,函数 b```对函数 a一无所知。 但是,函数 `a包含处理` b```函数的panic情况的Go代码!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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