首頁 > 後端開發 > Golang > Go Panic Recovery:延後 `recover()` – 有什麼不同?

Go Panic Recovery:延後 `recover()` – 有什麼不同?

Patricia Arquette
發布: 2024-12-03 03:35:11
原創
549 人瀏覽過

Go Panic Recovery: Deferring `recover()` – What's the Difference?

延遲recover()與延遲recover()

在Go中,可以使用recover()函數來擷取並處理恐慌。但是,需要注意的是,defer 相對於recover() 呼叫的放置具有重要意義。

場景A: defer func() { receive() }()

在這種情況下,defer 語句安排一個匿名函數在目前函數的末尾執行。當執行函數時,它會呼叫recover()函數。這是捕捉和處理恐慌的有效方法,因為即使在封閉函數復原執行之前發生恐慌,recover()函數也會被執行。

場景 B:延遲recover()

在這種情況下,recover() 函數本身被安排為延遲函數。然而,這並不能如預期般運作,因為recover() 不會呼叫自身。因此,在封閉函數恢復執行之前發生的任何恐慌都不會被此延遲呼叫捕獲。

Go 文件中記錄了此行為:「如果在延遲函數之外調用恢復,則不會停止恐慌序列。」

一個有趣的例子: defer (func( ) { receive() })()

為了進一步說明這一點,請考慮以下程式碼:

var recover = func() { recover() }
defer recover()
panic("panic")
登入後複製

令人驚訝的是,此程式碼也不會出現恐慌。在本例中,我們建立一個函數類型的recover變數並將其初始化為呼叫內建recover()的匿名函數。然後我們將恢復變數的值指定為延遲函數。這使我們能夠捕獲並處理恐慌,因為延遲函數有效地呼叫了recover(),從而停止了恐慌序列。

以上是Go Panic Recovery:延後 `recover()` – 有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板