Go語言中用於錯誤處理的Defer、Panic和Recover - Sachin Karve
許多開發人員在開始開發企業級應用程式之前,往往會忽略程式語言的錯誤處理機制。最好以一種可以從異常中恢復(萬一發生)的方式開發程式碼。
不同的程式語言以不同的方式處理錯誤,異常和恢復。Go採用了Defer、Panic和Recover的方式,彼此密切配合以確保程式的順利執行。
Defer
Defer關鍵字將一個函式轉換為一種特殊的函式型別,在呼叫該函式時,它會新增到已儲存的函式呼叫列表中。當需要返回包裹函式時,這個函式呼叫列表將被執行。此處,包裹函式是指在其中defer被呼叫的函式。
目的:該函式在呼叫時得到評估,但在返回包裹函式時執行。
工作原理:一旦在程式執行期間呼叫了此函式,它將確保兩件事:
- 該函式及其引數值在呼叫時將進行評估。
- 該函式計劃在包裹函式返回之前立即執行。
Defer通常在開啟檔案、新的記憶體塊或資料庫連線時使用,以在函式完成執行之前正常關閉它。即使該函式由於程式碼中的任何錯誤而無法中途執行,它也可以工作。
Panic
正如官方網站所解釋的,Panic是“一種內建功能,可以停止普通的控制流並開始恐慌panicking ”。它可以在執行流程中呼叫異常。當發生錯誤或異常情況時,可以透過程式設計方式或執行時來呼叫Panic。
對於瞭解Java的人來說,它類似於throw()。
目的:停止通常的執行流程。可能是由於異常情況(例如執行時錯誤)或程式設計師有意呼叫導致的。
工作:呼叫此函式後,通常的執行流程將停止,程式進入緊急模式。如果堆疊上有任何延遲呼叫,則程式將執行那些延遲呼叫,否則將在緊急模式下返回其呼叫方,並在呼叫堆疊中繼續執行。
注意,當執行環境呼叫panic時,我們的panic函式未處理它。當panic是由執行環境引起時,我們需要一種不同的機制來使執行回到正軌。它稱為Recover()。
Recover
根據官方網站的說法,Recover 是“一種內建功能,可以重新獲得對panic goroutine的控制權”。
當且僅當在defer函式中呼叫Recover時,才可以使用Recover。通常,呼叫recover會簡單地返回一個nil值。
同樣,當且僅當函式已經進行了defer呼叫時,才可以捕獲panic。理解這一點對於使用Recover 至關重要。
目的:它旨在使系統在出現緊急情況後恢復正常。
工作:在defer函式中呼叫時,執行流程如下:
- 當執行例程panic時,正常執行停止,例程嘗試返回
- 由於例程在panic之前已經進行了defer呼叫,因此defer在例程返回之前被呼叫
- 現在,在defer中,我們放置recover呼叫,該呼叫捕獲緊急事件的引數並繼續進行恢復;恢復進一步繼續執行。
參考:
相關文章
- Go 錯誤處理指北:Defer、Panic、Recover 三劍客Go
- Golang錯誤處理函式defer、panic、recover、errors.New介紹Golang函式Error
- Go基礎系列:defer、panic和recoverGo
- Go 中的Defer,Panic 和 Recover 控制流Go
- 【譯】defer-panic-and-recover
- Go語言基礎-錯誤處理Go
- Go語言錯誤處理機制Go
- go的 err!=nil 和 panic+recover 這兩種錯誤處理機制的關係和區別是什麼?Go
- 優化 Go 錯誤處理,魔改 Go recover 靠譜嗎?優化Go
- Go語言之錯誤處理Go
- 錯誤處理:如何通過 error、deferred、panic 等處理錯誤?Error
- Go語言(golang)的錯誤(error)處理的推薦方案GolangError
- 從錯誤處理看 Rust 的語言和 Go 語言的設計RustGo
- Go 函式的健壯性、panic異常處理、defer 機制Go函式
- Golang 高效實踐之defer、panic、recover實踐Golang
- 【Go進階—基礎特性】panic 和 recoverGo
- go的錯誤處理Go
- Go 錯誤處理Go
- GO語言————6.4 defer 和追蹤Go
- go-carbon 1.2.6 版本釋出,優化錯誤處理機制,棄用出錯直接panic的粗暴處理方式Go優化
- go-carbon 1.2.6 版本釋出,最佳化錯誤處理機制,棄用出錯直接panic的粗暴處理方式Go
- 如何在 Go 中優雅的處理和返回錯誤(1)——函式內部的錯誤處理Go函式
- Go 的錯誤處理策略 筆記Go筆記
- Go 語言異常處理Go
- go 錯誤處理設計思考Go
- Go語言的表達性、錯誤處理方法和泛型等討論摘錄 - 駭客新聞Go泛型
- 智慧合約語言 Solidity 教程系列9 - 錯誤處理Solid
- Go語言的 序列處理 和 並行處理 有什麼區別 ?Go並行
- Go 語言處理 yaml 檔案GoYAML
- Go 併發 2.2:錯誤處理模式Go模式
- [譯] Go 1.13 errors 包錯誤處理GoError
- 開心檔之Go 錯誤處理Go
- 基於 React Redux 的錯誤處理ReactRedux
- [譯] Part 32: 詳解Golang 中的Panic 和 RecoverGolang
- Go 語言中遇到 _func not exported by package_ 錯誤,應該如何處理?GoExportPackage
- go語言初學者常見錯誤Go
- 【譯】Chars2vec:基於字元實現的可用於處理現實世界中包含拼寫錯誤和俚語的語言模型字元模型
- Python錯誤處理和異常處理(二)Python