golang中recover和panic用法
阿新 • • 發佈:2019-01-29
golang中沒有try... catch...,所以當golang中遇到panic時,如果不進行recover,便會導致整個程式掛掉,具體例子如下:
package main
import (
"fmt"
)
func main() {
panic("fault")
fmt.Println("panic")
}
執行結果:
panic: fault
goroutine 16 [running]:...
程式掛掉,並且報告出錯的地方,並打印出掉用的棧
解決辦理:利用defer延遲處理的recover進行恢復,具體例子如下:
程式首先執行panic,出現故障,此時跳轉到包含recover()的defer函式執行,recover捕獲panic,此時panic就不繼續傳遞.但是recover之後,程式並不會返回到panic那個點繼續執行以後的動作,而是在recover這個點繼續執行以後的動作,即執行上面的defer函式,輸出1.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
注意:利用recover處理panic指令,必須利用defer在panic之前宣告,否則當panic時,recover無法捕獲到panic,無法防止panic擴散.