golang异常处理
一、使用defer+recover
错误例子:
[root@localhostgo_test]#cat t1.go package main func main(){ panic(1) } [root@localhostgo_test]#go run t1.go panic: 1 goroutine 1 [running]: main.main() /root/go_test/t1.go:4 +0x39 exit status 2
异常处理例子:
[root@localhostgo_test]#cat error.go package main import "fmt" func test(){ defer func(){ //必须要先声明defer,否则不能捕获到panic异常 err := recover() if err != nil { fmt.Println("error!",err) // 这里的err其实就是panic传入的内容,1 } fmt.Println("123") }() err() } func err(){ fmt.Println("start...") panic(1) } func main(){ test() fmt.Println("end...") } [root@localhostgo_test]#go run error.go start... error! 1 123 end...
二、使用panic(不推荐使用)
panic 内置函数 ,接收一个 interface{}类型的值(也就是任何值了)作为参数。可以接收 error 类
型的变量,输出错误信息,并退出程序
例子:
package main import ( "fmt" "time" ) func main() { defer func() { //必须要先声明defer,否则不能捕获到panic异常 fmt.Println("2") if err := recover(); err != nil { fmt.Println(err) //这里的err其实就是panic传入的内容,bug } fmt.Println("3") }() f() } func f() { for { fmt.Println("1") panic("bug") //panic遇到错误直接就退出了 fmt.Println("4") //不会运行的 time.Sleep(1 * time.Second) } } ###结果## 1 2 bug 3
三、输出错误
使用errors.Now进行错误输出
例子:
package main import ( "fmt" "errors" ) func main(){ err := errors.New("error:未找到命令") if err != nil { fmt.Println(err) } fmt.Println("111") } ###结果## error:未找到命令 111