亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從恐慌中恢復的程序未按預期退出

從恐慌中恢復的程序未按預期退出

Go
蝴蝶不菲 2022-06-27 16:57:17
據我了解,當恐慌恢復時,我希望程序退出并表現出正常行為,但事實并非如此。我期望最后一行打印“程序結束”是否正確?如果出現運行時錯誤,它不會被打印,是嗎?package mainimport (    "fmt")func main() {    defer func() {        if r := recover(); r != nil {            fmt.Printf("Cause of panic ==>>, %q\n", r)        }    }()    f(3)    fmt.Println("End of program")}func f(x int) {    fmt.Printf("f(%d) is called.\n", x) //panic triggered when x==0    // defer called in reverse order in case of panic    defer fmt.Printf("defer %d\n", x+0/x)    f(x-1)}
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

Go 規范很好地描述了panic/recover發生的事情??只艜K止當前函數和所有調用者,直到程序退出。在途中,它執行所有的延遲函數。如果其中一個函數有 arecover()并且干凈地退出,則停止恐慌傳播。


在您的情況下,恐慌按以下順序終止函數:f(0), f(1), f(2), f(3), main(), 運行每個函數的延遲函數。


您的延遲函數recover()位于main(). 這意味著main()在到達 print 語句之前被恐慌中斷,并且延遲函數在之后被調用。


如果你想在 main 中捕捉恐慌、恢復并繼續,你需要添加一個中間函數。例如:



func main() {

    handlePanic(3)

    fmt.Println("End of program")

}


func handlePanic(x int) {

    defer func() {

        if r := recover(); r != nil {

            fmt.Printf("Cause of panic ==>>, %q\n", r)

        }

    }()

    f(x)

}


func f(x int) {

    fmt.Printf("f(%d) is called.\n", x) //panic triggered when x==0

    // defer called in reverse order in case of panic

    defer fmt.Printf("defer %d\n", x+0/x)


    f(x-1)

}


查看完整回答
反對 回復 2022-06-27
?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

不會打印“程序結束”。

當檢測到恐慌時,導致恐慌的函數立即返回,以及調用該函數的函數等,一直到調用的函數recover。當該函數返回并恢復時,程序會繼續運行,就好像沒有發生恐慌一樣。

在您的情況下,main是恢復的功能??只旁?code>f(3)調用時觸發,并且在 main 返回后進行恢復,繞過 println。


查看完整回答
反對 回復 2022-06-27
  • 2 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號