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)
}

TA貢獻1798條經驗 獲得超7個贊
不會打印“程序結束”。
當檢測到恐慌時,導致恐慌的函數立即返回,以及調用該函數的函數等,一直到調用的函數recover
。當該函數返回并恢復時,程序會繼續運行,就好像沒有發生恐慌一樣。
在您的情況下,main
是恢復的功能??只旁?code>f(3)調用時觸發,并且在 main 返回后進行恢復,繞過 println。
- 2 回答
- 0 關注
- 133 瀏覽
添加回答
舉報