一、概述
Go语言并没有像Java那样的try catch finally
的处理机制,而是提供了其特有的错误处理机制。在Go语言中,错误或异常分为error和panic两种,error一般是程序员可预知的,会进行合适的处理,例如检测输入是否合法等。而panic是程序员无法预知的异常,例如空指针或数组越界等。
二、error
Go 提供了两种创建error的方法,分别是:errors.New
fmt.Errorf
package main import ( "errors" "fmt" ) func main() { res1, err1 := div(1, 1) fmt.Println(res1, err1) res2, err2 := div(1, 0) fmt.Println(res2, err2) //返回一个error e := fmt.Errorf("自定义error") fmt.Println(e) } func div(n, m int) (int, error) { if m == 0 { return 0, errors.New("0不能作为分母") } return m / n, nil }
运行结果如下
三、panic
一般在没有recover的情况下panic会导致程序崩溃,panic,defer和recover经常同时出现,用于异常处理,下面是panic异常处理的示例。
package main import "fmt" func main() { //注册捕获panic的函数,必须先注册,若在panic之后则无效 defer doPanic() n := 0 res := 1 / n fmt.Println(res) //panic 之后的代码不会执行 } //当捕获到panic时触发此函数 func doPanic() { err := recover() if err != nil { fmt.Println("捕获到panic") } }
注意在Go语言中,recover只在defer调用的函数中有效,并且defer要在panic之前先注册,否则不能捕获异常。当panic被捕获到后,被注册的函数将获得程序控制权