go异常recover()
defer func() { err := recover() if err != nil { fmt.Println("panic=", err) } }()
今天在测试代码的时候一直报错!找了好久也不知道咋回事!
就一直网络异常
然后我师傅敲了上面这段代码,检查到了我的数组越界了!
然后我发现了我的逻辑错误!
于是乎!复习了一下go语言异常处理
go异常处理
首先 go语言不支持传统的try catch finally,所以go引入的处理方式是 defer, panic, recover
这三个异常的使用场景未:
go中可以抛出一个panic异常,然后在defer中通过recover捕获这个异常,然后正常处理
使用defer+recover处理异常请看下面!
package main import ( "fmt" ) func test(){ //使用defer +recover 来捕获和异常处理 defer func(){ err :=recover()//recover()内置函数,可以捕获到异常 if err!=nil { fmt.Println("err=",err) //这里可以将错误信息发送给管理员 fmt.Println("发送邮件给xxx") } }() num1 :=10 num2 :=0 res :=num1/num2 fmt.Println("res=",res) } func main(){ //测试 test() }
错误信息如下:
E:\goproject\go_test\errortest>go run error1.go
err= runtime error: integer divide by zero
自定义错误
go程序中,也支持自定义错误,使用errors.new和panic内置函数
(1)errors.new("错误说明"),会返回一个error类型的值,表示一个错误
(2)panic内置函数,接收一个interface{}类型的值作为参数,可以接收error类型的变量,输出错误信息,并退出程序
package main import ( "errors" "fmt" ) func test(){ //使用defer +recover 来捕获和异常处理 defer func(){ err :=recover()//recover()内置函数,可以捕获到异常 if err!=nil { fmt.Println("err=",err) //这里可以将错误信息发送给管理员 fmt.Println(" 发送邮件给xxx") } }() num1 :=10 num2 :=0 res :=num1/num2 fmt.Println("res=",res) } func readConf(name string)(err error){ if name =="config.ini"{ //读取。。。 return nil }else{ //返回一个自定义错误 return errors.New("读取文件错误") } } func test02(){ err :=readConf("config2.ini") if err!=nil{ //如果读取文件发送错误,就输出这个错误,并终止程序 panic(err) } fmt.Println("test02()继续执行") } func main(){ //测试 //test() test02() fmt.Println("main()下面的到吗。。。") }