recover 僅在延遲函式 defer 中有效,在正常的執行程序中,呼叫 recover 會回傳 nil 并且沒有其他任何效果.
重要的事再說一遍:僅當在一個defer函式中被完成時,呼叫recover()才生效,
我們來一段錯誤的代碼:
package mainimport "fmt"func main() { recover() // 無任何作用 panic("停止運行") recover() // 不會執行到 fmt.Println("結束")}
輸出:
panic: 停止運行goroutine 1 [running]:exit status 2
修改下,正確的代碼:
package mainimport "fmt"func main() { defer func() { fmt.Println("捕獲到例外:", recover()) }() panic("手動拋出例外")}
輸出:
捕獲到例外: 手動拋出例外
重要的事再說一遍:recover()的呼叫僅當它在defer函式中被直接呼叫時才有效,
繼續來看一段錯誤的代碼:
package mainimport "fmt"func doRecover() { fmt.Println("捕獲到例外 =>", recover()) //輸出: 捕獲到例外 => <nil>}func main() { defer func() { doRecover() //注意:這里間接使用函式,在函式中呼叫了recover()函式, // panic 沒有恢復,沒有捕獲到錯誤資訊 }() panic("手動拋出例外")}
輸出:
捕獲到例外 => <nil>panic: 手動拋出例外goroutine 1 [running]:main.main()exit status 2
總結:panic配合recover使用,recover要在defer函式中直接呼叫才生效,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55030.html
標籤:Go
