recover 僅在延遲函數 defer 中有效,在正常的執行過程中,調用 recover 會返回 nil 並且沒有其他任何效果.
重要的事再說一遍:僅當在一個defer函數中被完成時,調用recover()才生效。
我們來一段錯誤的代碼:
package main import "fmt" func main() { recover() // 無任何作用 panic("停止運行") recover() // 不會執行到 fmt.Println("結束") }
輸出:
panic: 停止運行 goroutine 1 [running]:exit status 2
修改下,正確的代碼:
package main import "fmt" func main() { defer func() { fmt.Println("捕獲到異常:", recover()) }() panic("手動拋出異常") }
輸出:
捕獲到異常: 手動拋出異常
重要的事再說一遍:recover()的調用僅當它在defer函數中被直接調用時才有效。
繼續來看一段錯誤的代碼:
package main import "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函數中直接調用才生效。