Golang中的panic和recover(捕獲異常)


func panic(interface{})和func recover() interface{}是Golang中用於錯誤處理的兩個函數。

 

panic的作用就是拋出一條錯誤信息,從它的參數類型可以看到它可以拋出任意類型的錯誤信息。在函數執行過程中的某處調用了panic,則立即拋出一個錯誤信息,同時函數的正常執行流程終止,但是該函數中panic之前定義的defer語句將被依次執行。之后該goroutine立即停止執行。

recover()用於將panic的信息捕捉。recover必須定義在panic之前的defer語句中。在這種情況下,當panic被觸發時,該goroutine不會簡單的終止,而是會執行在它之前定義的defer語句。

下面是一個簡單的例子:

-->捕捉自己設置的panic錯誤:

package main

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還可以執行")
}
// ///////////
a=10
該數的方根為: 3.1622776601683795
foo退出來了
b=-10
捕獲到的錯誤:必須輸入大於0的數
foo退出來了
該goroutine還可以執行

Process finished with exit code 0

 

----

--> 捕捉go語言內部的Panic錯誤:

package main

import "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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM