go語言之異常捕獲


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異常會隨着函數的調用棧向外傳遞

  1. 例如: A函數調用了B函數, B函數調用了C函數
  2.  如果在C函數中拋出了一個panic異常, 那么這個異常會一層一層的傳遞到B和A
  3.  也就是在B和A函數中也能捕獲到這個異常

比如下面的例子

func t_defer1(){
panic(123)
}


在main中也能捕獲到t_defer1中的異常
func main(){
defer func() {
if err:=recover();err != nil{
fmt.Println(err)
}
}()
  t_defer1()
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM