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

來源:互聯網
上載者:User

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.