Go 错误处理
在 Go 中如果遇到错误,该如何处理?可以看下最常见的除零异常:
num := 10
fmt.Println(num / 0)
可以发现,当我们直接运行上面的代码的时候,程序抛出了一个异常并且程序直接退出了
➜ go-learn go run error_handler.go
# command-line-arguments
./error_handler.go:9:20: invalid operation: division by zero
在程序中,我们往往会发生一些错误(panic),但是这些错误我们希望能够感知并处理,而不是直接将程序退出。
在 Go 语言中,不支持传统的 try...catch
这种处理方式,而是引入了:defer
panic
recover
来进行错误处理。
例如:在程序中可以抛出一个 panic
异常,然后在 defer
中通过 recover
去捕获这个异常进行处理。
func main() {
test()
fmt.Println("我来证明程序没有退出....")
}
func test() {
defer func() {
err := recover()
if err != nil {
fmt.Println("err =", err)
}
}()
num := 10
num2 := 0
fmt.Println(num / num2)
}
错误处理后,可以让我们的程序更加健壮,如果在一些必要的流程,我们还可以加入预警代码,例如发生错误后将错误信息以邮件、短信等方式通知开发者处理。
自定义错误
在 Go 程序中,也可以自定义错误,使用 errors.New
和 panic
内置函数。
errors.New("错误说明")
会返回一个error
类型的值,表示一个错误。panic
内置函数接收一个interface {}
类型的值作为参数,也可以接收一个error
类型的变量,他可以输出一个错误消息并推出程序。
func main() {
fmt.Println("hello world")
data, err := invoke()
if err != nil {
fmt.Println("即将抛出异常并推出程序")
panic(err)
}
fmt.Println("数据是 ===>", data)
}
func invoke() (data string, err error) {
err = throw_error("clove")
if err != nil {
return "错误", err
}
return "输入正确", nil
}
func throw_error(fileName string) (err error) {
if fileName != "clover" {
return errors.New("输入错误")
}
return nil
}