1 什么是異常
不按照我們期望執行的都可以稱之為異常
2 go語言中如何處理異常
一種是程序發生異常時, 將異常信息反饋給使用者
一種是程序發生異常時, 立刻退出終止程序繼續運行
我們可以通過panic來拋出異常。
func t_defer3(){
print("t_defer3\n")
panic("t_defer3_error")
}
func main(){
t_defer3()
print("test end")
}
執行結果:
t_defer3
panic: t_defer3_error
goroutine 1 [running]:
main.t_defer3()
D:/go_prj/src/test.go:46 +0x63
main.main()
D:/go_prj/src/test.go:50 +0x29
但是發現在panic發生的時候,整個goroutine都退出了。比如最后的test end就沒有被執行。我們既想拋出異常,又想讓進程繼續運行,那就只能去捕獲異常。捕獲異常就要用到recover
func t_defer1(){
defer func() {
if r:=recover();r!=nil{
print("error found\n")
fmt.Println(r)
}
}()
panic(123)
}
func main(){
t_defer1()
print("test end")
}
執行結果
123
error found
test end
異常有幾個注意點:
1 同一個函數中, 多個panic異常, 只有第一個會被捕獲
2 defer和recover必須在panic拋出異常之前定義。如果defer和recover在panic后定義,則異常不能被捕獲到
3 panic異常會隨着函數的調用棧向外傳遞
-
例如: A函數調用了B函數, B函數調用了C函數
-
如果在C函數中拋出了一個panic異常, 那么這個異常會一層一層的傳遞到B和A
-
也就是在B和A函數中也能捕獲到這個異常
比如下面的例子
func t_defer1(){
panic(123)
}
在main中也能捕獲到t_defer1中的異常
func main(){
defer func() {
if err:=recover();err != nil{
fmt.Println(err)
}
}()
t_defer1()
}