Golang中的panic和recover
阿新 • • 發佈:2018-11-25
func panic(interface{})和func recover() interface{}是Golang中用於錯誤處理的兩個函式。
panic的作用就是丟擲一條錯誤資訊,從它的引數型別可以看到它可以丟擲任意型別的錯誤資訊。在函式執行過程中的某處呼叫了panic,則立即丟擲一個錯誤資訊,同時函式的正常執行流程終止,但是該函式中panic之前定義的defer語句將被依次執行。之後該goroutine立即停止執行。
recover()用於將panic的資訊捕捉。recover必須定義在panic之前的defer語句中。在這種情況下,當panic被觸發時,該goroutine不會簡單的終止,而是會執行在它之前定義的defer語句。
下面是一個簡單的例子:
import "fmt" import "math" func foo(a int) { defer fmt.Println("foo退出來了") defer func() { if r := recover(); r != nil { fmt.Printf("捕獲到的錯誤:%s\n", r) } }() if a < 0 { panic("必須輸入大於0的數") } fmt.Println("該數的方根為:", math.Sqrt(float64(a))) } func main() { var a int a = 10 fmt.Printf("a=%d\n", a) foo(a) var b int b = -10 fmt.Printf("b=%d\n", b) foo(b) fmt.Println("該goroutine還可以執行") }
執行結果:
從執行結果可以看出,recover在捕獲了panic丟擲的錯誤時,程式不會崩潰。panic和recover其實就類似於其他語言中的throw和catch,方便進行多層巢狀的錯誤處理。