Go 语言异常处理
错误处理:如何通过 error、deferred、panic 等处理错误?
error
在 Go 语言中,错误是可以预期的,并且不是非常严重,不会影响程序的运行。对于这类问题,可以用返回错误给调用者的方法,让调用者自己决定如何处理。
在 Go 语言中,error 是一个接口,定义如下
type error interface {
Error() string
}
如何New出一个函数,可以使用 errors.New(), fmt.Errorf("")
Go 1.13 版本的 error 嵌套
在没有官方的嵌套方案出来之前,假如我们想使用 error 嵌套,我们必须像下面那么实现, 在自定义的 CusError 里面嵌套另外一个 err
type CusError struct{
err error
Msg string
}
Go 1.13 之后, 官方给我们出了一种解决方案 error Wrap
fmt.Errorf("Wrap了一个错误:%w", e) 或者 errors.
WithMessage(err error, message string)
装饰一个错误
errors.Unwrap(err error) //通过 errors.Unwrap 函数得到被嵌套的 error。
errors.Is(err, target error) //用来判断两个 error 是否是同一个
errors.As(err error, target interface{}) //error 断言
Deferred 函数
Go 语言为我们提供了 defer 函数,可以保证文件关闭后一定会被执行,不管你自定义的函数出现异常还是错误。
defer 关键字用于修饰一个函数或者方法,使得该函数或者方法在返回前才会执行,也就说被延迟,但又可以保证一定会执行。defer 遵循先入后出原则
Panic 异常
panic 异常是一种非常严重的情况,会让程序中断运行,使程序崩溃,所以如果是不影响程序运行的错误,不要使用 panic,使用普通错误 error 即可。通常我们会使用 Recover 捕获 Panic 异常
什么时候使用Error,什么时候使用Panic?
对于真正意外的情况,那些表示不可恢复的程序错误,例如索引越界、不可恢复的环境问题、栈溢出,我们才使用 panic。对于其他的错误情况,我们应该是期望使用 error 来进行判定。