首頁 > 後端開發 > Golang > 為什麼 `defer receive()` 不會在 Go 中捕捉恐慌?

為什麼 `defer receive()` 不會在 Go 中捕捉恐慌?

Linda Hamilton
發布: 2024-12-05 02:08:09
原創
879 人瀏覽過

Why Doesn't `defer recover()` Catch Panics in Go?

defer receive() 何時無法捕捉恐慌?

在 Go 中,defer 函數會依照其宣告的相反順序執行,當函數正常回傳或出現恐慌。雖然 defer func() {recover() }() 可以有效地從恐慌中恢復,但 deferrecover() 卻並非如此。

此行為源自於receive() 的文檔,該文檔指出「如果在外部延遲函數呼叫recover,它不會停止恐慌序列。」在defer receive() 的情況下,recover 本身就是一個延遲函數,因此不會呼叫自身。

範例:

考慮以下程式碼:

package main

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

這段程式碼確實會出現恐慌,並顯示訊息“panic:panic”,表示deferrecover()並沒有阻止

工作範例:

相反,以下程式碼成功從恐慌中恢復:

package main

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

在這種情況下,匿名當主函數返回或發生緊急情況時呼叫該函數。在這個匿名函數中,呼叫recover(),成功捕獲並防止了恐慌。

例外範例:

有趣的是,以下程式碼也避免了恐慌:

package main

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

這裡,recover 函數變數保存了對呼叫內建recover() 的匿名函數的參考。指定此變數作為延遲函數可以有效地呼叫內建的recover(),從而停止恐慌。

以上是為什麼 `defer receive()` 不會在 Go 中捕捉恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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