首頁 >後端開發 >Golang >golang panic可以捕捉標準錯誤嗎

golang panic可以捕捉標準錯誤嗎

(*-*)浩
(*-*)浩原創
2019-12-17 10:17:562711瀏覽

golang panic可以捕捉標準錯誤嗎

panic                                  # 存取越界、空指標參考等,這些運行時錯誤會造成panic異常。

golang中沒有try ... catch...這類異常捕獲語句,但是提供了panic和recover內建函數,用於拋出異常以及異常的捕獲。

• panic、 recover 參數類型為 interface{},因此可拋出任何類型物件。 • 如果程式出現了致命的錯誤,導致整個程式無法進行下去,golang提供了panic函數,用來實現程式的退出。

• 當程式發生 panic 時,使用 recover 可以重新獲得對該程式的控

制。

• 不是所有的panic異常都來自運行時,直接呼叫內建的panic函數也會引發panic異常

• panic函數接受任何值作為參數。

(1)panic的使用

①延遲調試中引發的錯誤,可被後續延遲調試捕獲,但僅最後錯誤可被捕獲。

func test() {defer func() {
    fmt.Println(recover())
}()defer func() {
    panic("defer panic")
}()
    panic("test panic")
}func main() {
    test()    //defer panic}
②當函數發生 panic 時,它會終止運行,在執行完所有的延遲函數後,程式控制會返回到該函數的呼叫方。這樣的過程會一直持續下去,直到當前協程的所有函數都返回退出,然後程式會列印出 panic 訊息,接著列印出堆疊跟踪,最後程式終止。

如果函數沒有 panic,呼叫 recover 函數不會取得任何訊息,也不會影響目前進程。

demo

package mainimport (    "fmt")func fullName(firstName *string, lastName *string) {    if firstName == nil {
        panic("Firsr Name can't be null")
    }    if lastName == nil {
        panic("Last Name can't be null")
    }
    fmt.Printf("%s %s\n", *firstName, *lastName)
    fmt.Println("returned normally from fullName")
}func test(){
    defer fmt.Println("deferred call in test")
    firName := "paul"
    fullName(&firName, nil)
}func main() {
    defer fmt.Println("deferred call in main")
    test()
    fmt.Println("returned normally from main")
}

以上是golang panic可以捕捉標準錯誤嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn