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