Go語言中用於錯誤處理的Defer、Panic和Recover - Sachin Karve

banq發表於2020-09-20

許多開發人員在開始開發企業級應用程式之前,往往會忽略程式語言的錯誤處理機制。最好以一種可以從異常中恢復(萬一發生)的方式開發程式碼。
不同的程式語言以不同的方式處理錯誤,異常和恢復。Go採用了Defer、Panic和Recover的方式,彼此密切配合以確保程式的順利執行。
 

Defer
Defer關鍵字將一個函式轉換為一種特殊的函式型別,在呼叫該函式時,它會新增到已儲存的函式呼叫列表中。當需要返回包裹函式時,這個函式呼叫列表將被執行。此處,包裹函式是指在其中defer被呼叫的函式。
目的:該函式在呼叫時得到評估,但在返回包裹函式時執行。
工作原理:一旦在程式執行期間呼叫了此函式,它將確保兩件事:

  1. 該函式及其引數值在呼叫時將進行評估。
  2. 該函式計劃在包裹函式返回之前立即執行。

Defer通常在開啟檔案、新的記憶體塊或資料庫連線時使用,以在函式完成執行之前正常關閉它。即使該函式由於程式碼中的任何錯誤而無法中途執行,它也可以工作。
 

Panic
正如官方網站所解釋的,Panic是“一種內建功能,可以停止普通的控制流並開始恐慌panicking ”。它可以在執行流程中呼叫異常。當發生錯誤或異常情況時,可以透過程式設計方式或執行時來呼叫Panic。
對於瞭解Java的人來說,它類似於throw()。
目的:停止通常的執行流程。可能是由於異常情況(例如執行時錯誤)或程式設計師有意呼叫導致的。
工作:呼叫此函式後,通常的執行流程將停止,程式進入緊急模式。如果堆疊上有任何延遲呼叫,則程式將執行那些延遲呼叫,否則將在緊急模式下返回其呼叫方,並在呼叫堆疊中繼續執行。
注意,當執行環境呼叫panic時,我們的panic函式未處理它。當panic是由執行環境引起時,我們需要一種不同的機制來使執行回到正軌。它稱為Recover()。
 

Recover
根據官方網站的說法,Recover 是“一種內建功能,可以重新獲得對panic goroutine的控制權”。

當且僅當在defer函式中呼叫Recover時,才可以使用Recover。通常,呼叫recover會簡單地返回一個nil值。
同樣,當且僅當函式已經進行了defer呼叫時,才可以捕獲panic。理解這一點對於使用Recover 至關重要。
目的:它旨在使系統在出現緊急情況後恢復正常。
工作:在defer函式中呼叫時,執行流程如下:

  1. 當執行例程panic時,正常執行停止,例程嘗試返回
  2. 由於例程在panic之前已經進行了defer呼叫,因此defer在例程返回之前被呼叫
  3. 現在,在defer中,我們放置recover呼叫,該呼叫捕獲緊急事件的引數並繼續進行恢復;恢復進一步繼續執行。


參考:

為什麼Golang現在還不能用於構建企業系統的原因 - Dmitry

 

相關文章