天天看点

Go 语言异常处理Go 语言异常处理

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 来进行判定。