2 回答

TA貢獻1801條經(jīng)驗 獲得超16個贊
Go 規(guī)范很好地描述了panic/recover發(fā)生的事情??只艜K止當(dāng)前函數(shù)和所有調(diào)用者,直到程序退出。在途中,它執(zhí)行所有的延遲函數(shù)。如果其中一個函數(shù)有 arecover()并且干凈地退出,則停止恐慌傳播。
在您的情況下,恐慌按以下順序終止函數(shù):f(0), f(1), f(2), f(3), main(), 運行每個函數(shù)的延遲函數(shù)。
您的延遲函數(shù)recover()位于main(). 這意味著main()在到達 print 語句之前被恐慌中斷,并且延遲函數(shù)在之后被調(diào)用。
如果你想在 main 中捕捉恐慌、恢復(fù)并繼續(xù),你需要添加一個中間函數(shù)。例如:
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條經(jīng)驗 獲得超7個贊
不會打印“程序結(jié)束”。
當(dāng)檢測到恐慌時,導(dǎo)致恐慌的函數(shù)立即返回,以及調(diào)用該函數(shù)的函數(shù)等,一直到調(diào)用的函數(shù)recover
。當(dāng)該函數(shù)返回并恢復(fù)時,程序會繼續(xù)運行,就好像沒有發(fā)生恐慌一樣。
在您的情況下,main
是恢復(fù)的功能??只旁?code>f(3)調(diào)用時觸發(fā),并且在 main 返回后進行恢復(fù),繞過 println。
- 2 回答
- 0 關(guān)注
- 142 瀏覽
添加回答
舉報