golang中沒有try... catch...,因此當golang中遇到panic時,若是不進行recover,便會致使整個程序掛掉,具體例子以下:golang
package main import ( "fmt" ) func main() { panic("fault") fmt.Println("panic") }
運行結果:
panic: fault
goroutine 16 [running]:...
程序掛掉,而且報告出錯的地方,並打印出掉用的棧
解決辦理:利用defer延遲處理的recover進行恢復,具體例子以下:函數
package main import ( "fmt" ) func main() { defer func() { fmt.Println("1") }() defer func() { if err := recover(); err != nil { fmt.Println(err) } }() panic("fault") fmt.Println("2") } 運行結果: fault 1
程序首先運行panic,出現故障,此時跳轉到包含recover()的defer函數執行,recover捕獲panic,此時panic就不繼續傳遞.可是recover以後,程序並不會返回到panic那個點繼續執行之後的動做,而是在recover這個點繼續執行之後的動做,即執行上面的defer函數,輸出1.
注意:利用recover處理panic指令,必須利用defer在panic以前聲明,不然當panic時,recover沒法捕獲到panic,沒法防止panic擴散.spa