5. go基础:通过 error/deffer/panic 处理错误
正确处理错误,可以让程序更加稳定。error是一个错误接口,一般来说,error是不会影响到整个程序运行的,我们可以自行处理。 而panic是会导致程序直接崩溃退出的,我们也可以用 go自带的recover()来恢复panic,在程序崩溃前进行资源的释放工作。 错误 error接口 error接口只有一个Error方法,返回具体的错误信息(string) type error interface { Error() string } 一个字符串转整数的例子: func main(){ // try to conver alpha "a" to integer i, err := strconv.Atoi("a") if err != nil { fmt.Println(err) } else { fmt.Println(i) } } 尝试将字符 a 转换成为 整数,显然是不成功的,因此返回了err 一般而言,error 接口用于当方法或者函数执行遇到错误时进行返回,而且是第二个返回值。通过这种方式,可以让调用者自己根据错误信息决定如何进行下一步处理。 error 工厂函数 除了可以使用其他函数,自己定义的函数也可以返回错误信息给调用者 自定义error 自定义error就是先自定义一个新的类型,然后实现error接口 // 自定义一个结构体,携带错误码和具体的错误信息 type commonError struct { errorCode int // 错误码 errorMsg string // 错误信息 } // 实现error接口 func (ce *commonError) Error() string { return ce.errorMsg } error 断言 func add(a, b int) int, error { if a < 0 || b < 0 { return 0, &commonError{ errorCode: 1, errorMsg: "a and b must >= 0" } } return a + b, nil } func main(){ sum, err := add(-1, 2) // 错误类型断言 if cm, ok := err.(*commonError); ok { fmt.Printf("Error code = %d, error message = %s\n", cm.errorCode, cm.errorMsg) } else { fmt.Printf("Sum = %d\n", sum) } } 错误嵌套 Error Wrapping 需求,将一个错误嵌套到另一个错误中: ...