处理错误最直接的方式是通过错误码
C 语言,其通过函数的返回值标识是否有错
然后通过全局的 errno 变量并配合一个 errstr 的数组来告诉你为什么出错。
Go语言的错误处理
Go 语言的函数支持多返回值, 可以在返回接口把业务语义(业务返回值)和控制语义(出错返回值)区分开来。
Go 语言的很多函数都会返回 result, err
两个值
参数上基本上就是入参,而返回接口把结果和错误分离,这样使得函数的接口语义清晰;
Go 语言中的错误参数如果要忽略,需要显式地忽略,用 _ 这样的变量来忽略;
因为返回的 error 是个接口(其中只有一个方法 Error(),返回一个 string ),所以你可以扩展自定义的错误处理
if err != nil {
switch err.(type) {
case *json.SyntaxError:
...
case *ZeroDivisionError:
...
case *NullPointerError:
...
default:
...
}
}
资源清理
使用 defer
关键词进行清理。
func Close(c io.Closer) {
err := c.Close()
if err != nil {
log.Fatal(err)
}
}
func main() {
r, err := Open("a")
if err != nil {
log.Fatalf("error opening 'a'\n")
}
defer Close(r) // 使用defer关键字在函数退出时关闭文件。
r, err = Open("b")
if err != nil {
log.Fatalf("error opening 'b'\n")
}
defer Close(r) // 使用defer关键字在函数退出时关闭文件。
}