Golang中的panic和recover

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

相關文章
相關標籤/搜索