- Go中沒有錯誤機制
- error 型別實現了 error 介面
type error interface { Error() string }
- 可以通過 errors.New 來實現快速建立錯誤資訊
errors.New("這是一條錯誤提示")
Panic 的基本定義和使用
- panic 用於不可以恢復的錯誤
- 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 的基本定義和使用
- os.Exit 退出時不呼叫defer 指定的函式
- os.Exit 退出時不輸出當前呼叫棧資訊
func TestExit(t *testing.T) { defer func() { fmt.Println("這段程式碼不會執行!") }() fmt.Println("開始執行") os.Exit(-1) // 直接退出 exit status 255 } // 輸出結果如下 開始執行 exit status 255
Recover 的使用
- 如果在 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 協議》,轉載必須註明作者和本文連結