golang中是怎麼捕獲異常的?

go沒有php java nodejs python的try catch
讓我這個寫習慣了try的人怎麼辦…

和異常捕獲有關的幾個內置函數

defer 析構,函數結束時候調用
panic 拋出致命錯誤,同throw
recover 恢復,
go語言中的defer就像c++中的析構函數,但是go語言中defer的對象是函數(或者對象的方法),defer能保證在函數結束最後執行該方法(函數),但是有例外:如果在定義的方法中defer定義的方法如果在panic後面,defer定義的方法就無法執行到。

panic 是用來表示非常嚴重的不可恢復的錯誤的。在Go語言中這是一個內置函數,接收一個interface{}類型的值作爲參數。panic 的作用就像我們平常接觸的異常。不過Go可沒有try…catch,所以,panic一般會導致程序掛掉(除非recover)。所以,Go語言中的異 常,那真的是異常了。你可以試試,調用panic看看,程序立馬掛掉,然後Go運行時會打印出調用棧。
但是,關鍵的一點是,即使函數執行的時候 panic了,函數不往下走了,運行時並不是立刻向上傳遞panic,而是到defer那,等defer的東西都跑完了,panic再向上傳遞。所以這時 候 defer 有點類似 try-catch-finally 中的 finally。
panic就是這麼簡單。拋出個真正意義上的異常。

panic的函數並不會立刻返回,而是先defer,再返回,如果有辦法將panic捕獲到,並阻止panic傳遞,就正常處理,如果沒有沒有捕獲,程序直接異常終止(可以註釋掉下面程序中的recover試一試)。

Go語言提供了recover內置函數,前面提到,一旦panic,邏輯就會走到defer那,那我們就在defer那等着,調用recover函 數將會捕獲到當前的panic(如果有的話),被捕獲到的panic就不會向上傳遞了,於是,世界恢復了和平。你可以幹你想幹的事情了。
不過要注意的是,recover之後,邏輯並不會恢復到panic那個點去,函數還是會在defer之後返回。

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章