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中文網其他相關文章!