func panic(interface{})和func recover() interface{}是Golang中用於錯誤處理的兩個函數。
panic的作用就是拋出一條錯誤資訊,從它的參數類型可以看到它可以拋出任意類型的錯誤資訊。在函數執行過程中的某處調用了panic,則立即拋出一個錯誤資訊,同時函數的正常執行流程終止,但是該函數中panic之前定義的defer語句將被依次執行。之後該goroutine立即停止執行。
recover()用於將panic的資訊捕捉。recover必須定義在panic之前的defer語句中。在這種情況下,當panic被觸發時,該goroutine不會簡單的終止,而是會執行在它之前定義的defer語句。
下面是一個簡單的例子:
-->捕捉自己設定的panic錯誤:
package mainimport "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還可以執行")}// ///////////a=10該數的方根為: 3.1622776601683795foo退出來了b=-10捕獲到的錯誤:必須輸入大於0的數foo退出來了該goroutine還可以執行Process finished with exit code 0
----
--> 捕捉go語言內部的Panic錯誤:
package mainimport "fmt"func foo() { defer func() { if r := recover(); r != nil { fmt.Printf("捕獲到的錯誤:%s\n", r) } }() var a, b int a, b = 1, 1 c := 3/(a-b) fmt.Println(a, b, c)}func main() { foo()}//====捕獲到的錯誤:runtime error: integer divide by zero