函式 使用 defer 改善錯誤處理

2021-10-25 08:31:04 字數 570 閱讀 8931

以便defer能在合適時機執行

// 錯誤的例子

func example()

}

這地方有個問題,example函式是乙個加鎖操作。m.unlock()只有在example函式結束的時候才執行,那麼每次迴圈實際上是執行m.lock()語句,這個時候解鎖操作會被延遲到函式結束。很顯然這個邏輯並不是我們想要的,我們當時寫的意思是加鎖,defer為了保證鎖會被釋放,defer就是語句後面就算出錯也會執行解鎖。

顯然現在邏輯出錯了,解鎖被延長了。

很顯然,它會認為程式死鎖,為什麼死鎖,是因為你不停的加鎖,解鎖沒有執行。

怎麼重構呢?最簡單的做法用匿名函式func(){}把for迴圈裡面邏輯包起來,因為這個時候defer是在匿名函式執行完執行,所以你每次迴圈都可以保證加鎖解鎖都可以被執行。

func example() ()

}}

所以利用匿名函式縮小作用域,因為不用匿名函式這個作用域相當於example。如果做了匿名函式重構,當前作用域就

MySql錯誤處理 錯誤處理的例子

有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not found 執行 rollback和產生一條錯誤...

Linux C函式之錯誤處理函式

錯誤處理函式 3 ferror 檢查檔案流是否有錯誤發生 標頭檔案 stdio.h 函式定義 int ferror file stream 說明 ferror 用來檢查引數stream所指定的檔案流是否發生了錯誤情況,若有則返回非0值.perror 列印出錯誤原因資訊字串 標頭檔案 stdio.h ...

Linux C函式之錯誤處理函式

錯誤處理函式 3 ferror 檢查檔案流是否有錯誤發生 標頭檔案 stdio.h 函式定義 int ferror file stream 說明 ferror 用來檢查引數stream所指定的檔案流是否發生了錯誤情況,若有則返回非0值.perror 列印出錯誤原因資訊字串 標頭檔案 stdio.h ...