golang錯誤處理機制:panic與recover

原文地址:http://www.niu12.com/article/14
panic知識點
package main

import (
    "fmt"
    "github.com/pkg/errors"
)

func main() {
    outerFunc()
    fmt.Println(1)
}

func outerFunc()  {
    innerFunc()
}

func innerFunc()  {
    panic(errors.New("An intended fatal error"))
}

當調用innerFunc 函數中的panic函數後,innerFunc 的執行會被中止。
緊接着,流程控制權會交回給調用方outerFunc函數。
而後, outerFunc函數的執行也將被中止。運行時恐慌就這樣沿着調用棧反方向進行傳播,
直至到達當前goroutine的調用棧的最頂層。-旦達到頂層,就意味着該goroutine調用棧
中全部函數的執行都已經被中止了,程序已經崩潰。
GO運行時系統也會調用panic() 函數
recover
運行時恐慌一旦被引起,就會向調用方傳播直至程序崩潰。 Go 提供了專用於「攔截」
運行時恐慌的內建函數 recover ,它能夠使氣前的程序從恐慌狀態中恢復並從新獲
得流程控制權。 recover 函數被調川后,會返回一個 interfaoe { }類型的結果、
若是當時的程序正處於運行時恐慌的狀態,那麼這個結果就會是非 nil 的。

func innerFunc() {
    defer func() {
        if p := recover(); p != nil {
            fmt.Printf("Recovered panic:%s\n", p)
        }
    }()
    panic(errors.New("An intended fatal error"))
}
將defer 匿名函數放在函數體的開始處,能夠有效防止該函數及其下層調用中的代碼引起運行時恐慌

口能夠把運行時恐慌的攜帶值轉換爲error類型值,並看成常規結果返回給調用方。
    這樣既阻止了恐慌的擴散,又傳遞了引發恐慌的緣由。
口檢查運行時恐慌攜帶值的類型,並根據類型作不一樣的後續動做,這樣能夠精確地
    控制程序的錯誤處理行爲。
  
相關文章
相關標籤/搜索