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呼叫,該呼叫捕獲緊急事件的引數並繼續進行恢復;恢復進一步繼續執行。
參考:
相關文章
- Golang錯誤處理函式defer、panic、recover、errors.New介紹Golang函式Error
- Go基礎系列:defer、panic和recoverGo
- Go 中的Defer,Panic 和 Recover 控制流Go
- 錯誤處理:如何通過 error、deferred、panic 等處理錯誤?Error
- 【譯】defer-panic-and-recover
- Go 語言的錯誤訊息處理Go
- Go語言基礎-錯誤處理Go
- Go語言錯誤處理機制Go
- go的 err!=nil 和 panic+recover 這兩種錯誤處理機制的關係和區別是什麼?Go
- Go語言之錯誤處理Go
- 優化 Go 錯誤處理,魔改 Go recover 靠譜嗎?優化Go
- Go 函式的健壯性、panic異常處理、defer 機制Go函式
- Go語言(golang)的錯誤(error)處理的推薦方案GolangError
- 從錯誤處理看 Rust 的語言和 Go 語言的設計RustGo
- 【Go進階—基礎特性】panic 和 recoverGo
- Golang 高效實踐之defer、panic、recover實踐Golang
- go的錯誤處理Go
- GO語言————6.4 defer 和追蹤Go
- Go 錯誤處理Go
- go-carbon 1.2.6 版本釋出,優化錯誤處理機制,棄用出錯直接panic的粗暴處理方式Go優化
- go-carbon 1.2.6 版本釋出,最佳化錯誤處理機制,棄用出錯直接panic的粗暴處理方式Go
- Go 語言異常處理Go
- 如何在 Go 中優雅的處理和返回錯誤(1)——函式內部的錯誤處理Go函式
- Go 的錯誤處理策略 筆記Go筆記
- Go語言的表達性、錯誤處理方法和泛型等討論摘錄 - 駭客新聞Go泛型
- go 錯誤處理設計思考Go
- panic/recover工作原理
- Go語言的 序列處理 和 並行處理 有什麼區別 ?Go並行
- Go 語言處理 yaml 檔案GoYAML
- go語言初學者常見錯誤Go
- [譯] Go 1.13 errors 包錯誤處理GoError
- 開心檔之Go 錯誤處理Go
- Go 併發 2.2:錯誤處理模式Go模式
- 基於 React Redux 的錯誤處理ReactRedux
- Go 語言操作 MySQL 之 預處理GoMySql
- PHP錯誤處理和異常處理PHP
- 智慧合約語言 Solidity 教程系列9 - 錯誤處理Solid
- Go 語言中遇到 _func not exported by package_ 錯誤,應該如何處理?GoExportPackage