異常處理 - Go 學習記錄

Ali發表於2019-03-20
  1. Go中沒有錯誤機制
  2. error 型別實現了 error 介面
    type error interface {
        Error() string
    }
  3. 可以通過 errors.New 來實現快速建立錯誤資訊
    errors.New("這是一條錯誤提示")

Panic 的基本定義和使用

  1. panic 用於不可以恢復的錯誤
  2. Panic 退出前會執行 defer 指定的內容、
    func TestPanic(t *testing.T) {
        defer func() {
            fmt.Println("最後結果依舊執行!") // 這一部分的程式碼依舊執行
        }()
        fmt.Println("執行開始")
        panic(errors.New("錯誤資訊!"))
    }
    // 輸出大致結果如下
    開始
    最後結果依舊執行!
    --- FAIL: TestPanic (0.00s)
    panic: 錯誤資訊! [recovered]
    panic: 錯誤資訊!

os.Exit 的基本定義和使用

  1. os.Exit 退出時不呼叫defer 指定的函式
  2. os.Exit 退出時不輸出當前呼叫棧資訊
    func TestExit(t *testing.T) {
        defer func() {
            fmt.Println("這段程式碼不會執行!") 
        }()
        fmt.Println("開始執行")
        os.Exit(-1) // 直接退出 exit status 255
    }
    // 輸出結果如下
    開始執行
    exit status 255

Recover 的使用

  1. 如果在 defer 中使用了 recover() 函式,則會捕獲錯誤資訊,使該錯誤資訊終止報告。
    func TestRecover(t *testing.T) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recoverd 開始\n", err)
        }
    }()
    fmt.Println("開始執行")
    panic(errors.New("錯誤資訊!"))
    }
    // 輸出結果如下:
    開始執行
    recoverd 開始
    錯誤資訊!

    異常處理總結

    當一個函式在執行過程中出現了異常或遇到 panic(),正常語句就會立即終止,
    然後執行 defer 語句,再報告異常資訊,最後退出。
    如果在 defer 中使用了 recover() 函式,則會捕獲錯誤資訊,使該錯誤資訊終止報告。

學習記錄同步的練習程式碼移步 GitHub

本作品採用《CC 協議》,轉載必須註明作者和本文連結

高永立

相關文章