Go 的错误和异常处理 - 2 panic/recover

基础知识

网上吐槽 Go 的论点之一是它没有提供 try...catch 异常处理方式,而是通过函数返回值逐层往上抛。这种设计,鼓励工程师在代码中显式的检查错误,而非忽略错误,好处就是避免漏掉本应处理的错误。但是带来一个弊端,让代码啰嗦。

panic

  • panic 是用来表示非常严重的不可恢复的错误的。
  • 在Go语言中这是一个内置函数,接收一个 interface{} 类型的值作为参数。
  • panic 的作用就像我们平常接触的异常,一般会导致程序挂掉,然后 Go 运行时会打印出调用栈。

一般来说程序执行初始化的时候出问题,直接 panic 掉,省得上线运行后出更大的问题。有些时候,我们需要从异常中恢复。比如服务器程序遇到严重问题,产生了 panic, 这时我们至少可以在程序崩溃前做一些扫尾工作,如关闭客户端的连接,防止客户端一直等待等等。

recover

panic 会停掉当前正在执行的程序,不只是当前协程。在这之前,它会有序地执行完当前协程 defer 列表里的语句,其它协程里挂的 defer 语句不作保证。因此,我们经常在 defer 里挂一个 recover 语句,防止程序直接挂掉,这起到了 try...catch 的效果。

不过要注意的是,recover 之后,逻辑并不会恢复到 panic 那个点去,函数还是会在 defer 之后返回。

recover() 函数只在 defer 的上下文中才有效且只有通过在 defer 中用匿名函数调用才有效,直接调用的话只会返回 nil。

相关链接

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Apr 15, 2019

奉献爱心