golang 异常处理

94 阅读2分钟

前言

开发过程中会遇到各种错误,但是大家都不怎么会处理,有的时候返回 return err ,有时候 panic 错误,到底该怎么用?

错误类型

golang 官方库错误类型 为 error

var err error
err = fmt.Errorf("err:%v",1)
err = errors.New("err")
fmt.Println(err.Error())
panic(err)

上面代码片段有两种对err 赋值

大家程序中返回错误类型,大家统一都用这两种,千万不要自己造轮子,及时panic 错误的时候也不要随便抛出一个字符串。后面讲错误捕获的时候会说到这个。

如何处理错误

return err

在业务逻辑中需要对错误做逻辑处理,而不是让错误发生导致程序异常而退出

比如说我有个接口,用户传递参数不正确,导致不能处理业务,那就返回错误,给用户提示,而不是让程序崩溃掉,因为这种情况属于正常范围

panic err

程序执行中异常,这种异常不能容忍,也没办法做逻辑处理,直接panic 处理,应用程序会由于这个错误崩溃掉。

比如mysql 数据连接不上,redis 存储连接不上,理论这种情况就应该panic 出来。

当然具体情况具体对待。 这样做有个好处,我们在开发、调试、测试过程很容易发现问题,因为并不是所有人都会return 的 err 做处理的。

错误捕获

对应 panic err 的需要捕获,除非你能容忍你的程序在异常情况下崩溃掉。

在协程中也需要捕获 panic 错误,否则程序照样崩溃掉。

defer func() {
   if errX := recover(); errX != nil {
     fmt.println(err.Error())
   }
}()

在我们函数中增加上面语句,就可以捕获函数中、及调用的子函数中panic。

如果写在入口函数main 里面就可以捕获 所有的错误 。

但是有一点除外,协程中的错误无法捕获,需要在协程调用的函数中写上文函数。

panic 错误的时候,最好类型是官方error类型,因为在捕获之后好处理,不需要断言错误类型。

总结

程序中的错误,如果可以容忍,或者错误属于正常业务就可以return err

如果不能容忍的错误,就panic

如果panic 了,但是不希望程序崩溃掉,就需要通过 recover 捕获错误