1. 程式人生 > >Golang中的panic和recover

Golang中的panic和recover

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,方便進行多層巢狀的錯誤處理。