首頁 > 後端開發 > Golang > 主體

Golang 延遲函數可以在不終止恐慌序列的情況下觸發新的恐慌嗎?

Barbara Streisand
發布: 2024-11-03 07:08:29
原創
362 人瀏覽過

Can Golang Defer Functions Trigger New Panics Without Terminating the Panic Sequence?

延遲函數內部的恐慌是否可以接受,特別是在現有恐慌期間?

考慮以下程式碼片段:

func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

func main(){
    defer func(){
        x:=recover()
        println(x.(int));
    }()
    sub()
}
登入後複製

執行此指令時程式碼中,似乎最初的panic(1)被第二個panic(2)取代。

是否允許以這種方式繼續,或呼叫可能在defer 函數中?

是的,這是可以接受的。 由 defer 函數引起的恐慌並不是一個新的或獨特的情況;它只是表明恐慌序列將繼續。

提供的範例程式碼示範了這種可接受性,並說明了即使從defer 函數呼叫的panic() 也可以透過對recover() 的「更高」等級呼叫來捕獲.

Golang 規範規定,如果在執行延遲函數期間發生恐慌,如果恢復函數在沒有捕獲它的情況下執行了恐慌(),恐慌序列將不會結束。

此外,即使在延遲函數中呼叫panic(),所有其他延遲函數也會被執行。然而,延遲函數中沒有恢復函數的panic()將「包裝」現有的panic,而不是「覆蓋」它。

例如,考慮以下程式碼:

func main() {
    defer func() {
        fmt.Println("Checkpoint 1")
        panic(1)
    }()
    defer func() {
        fmt.Println("Checkpoint 2")
        panic(2)
    }()
    panic(999)
}
登入後複製

輸出:

Checkpoint 2
Checkpoint 1
panic: 999
    panic: 2
    panic: 1
登入後複製

即使每個defer 函數都呼叫panic(),它們仍然會被執行,並且產生的panic序列顯示傳遞給每個panic()呼叫的值。

當延遲函數中呼叫recover()時,最終的列印輸出也會顯示此「恢復」資訊:

defer func() {
    recover()
    fmt.Println("Checkpoint 1")
    panic(1)
}()
defer func() {
    recover()
    fmt.Println("Checkpoint 2")
    panic(2)
}()
登入後複製

輸出:

Checkpoint 2
Checkpoint 1
panic: 999 [recovered]
    panic: 2 [recovered]
    panic: 1
登入後複製

以上是Golang 延遲函數可以在不終止恐慌序列的情況下觸發新的恐慌嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!