Go 语言通过内置的错误接口提供了非常简单的错误处理机制。他是通过定义接口,接口类型是error来处理的。
定义:
type error interface{
Error() string
}
我们可以在代码里通过实现 error 接口类型来生成错误信息,就比如这个样子
func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("math: square root of negative number")
}
// 实现
}
函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息的,
下面我们就说一个例子,
在调用Sqrt的时候传递的一个负数,然后就得到了non-nil的error对象,将此对象与nil比较,结果为true,所以fmt.Println(fmt包在处理error时会调用Error方法)被调用,以输出错误,
result, err:= Sqrt(-1)
if err != nil {
fmt.Println(err)
}
实例:
实例运行结果
还得介绍一下两个函数panic 与 recover
一个用于主动抛出错误,一个用于捕获panic抛出的错误。
panic 与 recover 是 Go 的两个内置函数,这两个内置函数用于处理 Go 运行时的错误,panic 用于主动抛出错误,recover 用来捕获 panic 抛出的错误。
引发panic有两种情况,一是程序主动调用,二是程序产生运行时错误,由运行时检测并退出。
发生panic后,程序会从调用panic的函数位置或发生panic的地方立即返回,逐层向上执行函数的defer语句,然后逐层打印函数调用堆栈,直到被recover捕获或运行到最外层函数。
panic不但可以在函数正常流程中抛出,在defer逻辑里也可以再次调用panic或抛出panic。defer里面的panic能够被后续执行的defer捕获。
recover用来捕获panic,阻止panic继续向上传递。recover()和defer一起使用,但是defer只有在后面的函数体内直接被掉用才能捕获panic来终止异常,否则返回nil,异常继续向外传递。