第 9 行声明描述错误的结构体,成员保存错误的执行函数。
第 17 行使用 defer 将闭包延迟执行,当 panic 触发崩溃时,ProtectRun() 函数将结束运行,此时 defer 后的闭包将会发生调用。
第 20 行,recover() 获取到 panic 传入的参数。
第 22 行,使用 switch 对 err 变量进行类型断言。
第 23 行,如果错误是有 Runtime 层抛出的运行时错误,如空指针访问、除数为 0 等情况,打印运行时错误。
第 25 行,其他错误,打印传递过来的错误数据。
第 44 行,使用 panic 手动触发一个错误,并将一个结构体附带信息传递过去,此时,recover 就会获取到这个结构体信息,并打印出来。
第 57 行,模拟代码中空指针赋值造成的错误,此时会由 Runtime 层抛出错误,被 ProtectRun() 函数的 recover() 函数捕获到。
panic和recover的关系
panic 和 defer 的组合有如下特性:
有 panic 没 recover,程序宕机。
有 panic 也有 recover 捕获,程序不会宕机。执行完对应的 defer 后,从宕机点退出当前函数后继续执行。
更多golang知识请关注PHP中文网golang教程栏目。
以上就是golang如何防止意外崩溃的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
gorm 如果使用同一个sql.db 去开协程。为什么速度会比单线程跑快很多
更多相关阅读请进入《golang》频道 >>

Go语言101
一个与时俱进的Go编程知识库。