func panic(interface{})和func recover() interface{}是Golang中用於錯誤處理的兩個函數。
panic的做用就是拋出一條錯誤信息,從它的參數類型能夠看到它能夠拋出任意類型的錯誤信息。在函數執行過程當中的某處調用了panic,則當即拋出一個錯誤信息,同時函數的正常執行流程終止,可是該函數中panic以前定義的defer語句將被依次執行。以後該goroutine當即中止執行。函數
recover()用於將panic的信息捕捉。recover必須定義在panic以前的defer語句中。在這種狀況下,當panic被觸發時,該goroutine不會簡單的終止,而是會執行在它以前定義的defer語句。code
下面是一個簡單的例子:
blog
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還能夠執行") }
執行結果:import
從執行結果能夠看出,recover在捕獲了panic拋出的錯誤時,程序不會崩潰。panic和recover其實就相似於其餘語言中的throw和catch,方便進行多層嵌套的錯誤處理。float