langShift

錯誤處理

Go 的錯誤處理遵循獨特的哲學,強調顯式錯誤檢查而非異常處理。與 JavaScript 的 try...catch 機制或 C++ 的異常處理不同,Go 將錯誤視為必須顯式處理的值。這種方法促進了更清晰的程式碼流程,使錯誤處理更加可預測。

Go 的錯誤處理哲學

Go 的錯誤處理基於錯誤是值,不是異常的原則。這意味著:

  • 錯誤作為值從函數返回
  • 錯誤必須顯式檢查和處理
  • 沒有自動異常傳播
  • 清晰、可預測的控制流程
  • 沒有隱藏的錯誤路徑

這種哲學與 JavaScript 基於異常的方法有顯著不同:

正在加载...

error 介面

在 Go 中,錯誤由內建的 error 介面表示:

type error interface {
Error() string
}

任何實作了 Error() string 方法的類型都滿足 error 介面。這種簡單的設計允許靈活的錯誤類型,同時保持一致性。

正在加载...

錯誤處理模式

1. 顯式錯誤檢查

Go 中最常見的模式是在函數呼叫後立即檢查錯誤:

正在加载...

2. 使用 fmt.Errorf 進行錯誤包裝

Go 1.13 引入了使用 %w 動詞的錯誤包裝,允許您添加上下文同時保留原始錯誤:

正在加载...

3. 哨兵錯誤

哨兵錯誤是用於表示特定錯誤條件的預定義錯誤值:

正在加载...

錯誤處理最佳實踐

1. 不要忽略錯誤

始終適當地檢查和處理錯誤:

正在加载...

2. 使用 errors.Iserrors.As

用於錯誤比較和類型檢查:

正在加载...

與 JavaScript 錯誤處理的對比

特性JavaScriptGo
機制異常 (throw, try...catch)錯誤值(從函數返回)
錯誤類型Error 物件,自訂錯誤類error 介面,自訂錯誤類型
傳播自動向上傳播呼叫棧手動(必須返回和檢查)
控制流程可以繞過正常流程始終顯式,可預測的流程
效能棧展開開銷無開銷(只是值傳遞)
非同步處理使用 try...catchasync/await同步和非同步的相同模式
錯誤上下文使用 cause 的錯誤鏈使用 fmt.Errorf 的錯誤包裝

常見錯誤處理模式

1. 早期返回模式

當錯誤發生時提前返回,避免深層巢狀:

正在加载...

2. 錯誤聚合

收集多個錯誤並一起返回:

正在加载...

並發程式碼中的錯誤處理

錯誤處理在並發場景中變得更加複雜:

正在加载...

練習題:

  1. 解釋 Go 的錯誤處理方法與 JavaScript 基於異常的錯誤處理之間的區別。每種方法的優缺點是什麼?
  2. Go 中使用 fmt.Errorf 的錯誤包裝是如何工作的?提供一個何時以及為什麼使用它的例子。
  3. 描述 Go 錯誤處理中的早期返回模式,並解釋為什麼它被認為是最佳實踐。

專案想法:

建立一個簡單的 Go 檔案處理工具,演示各種錯誤處理模式。該工具應該:

  • 從檔案讀取設定
  • 並發處理多個檔案
  • 處理不同類型的錯誤(檔案未找到、權限被拒絕、無效格式)
  • 使用錯誤包裝提供上下文
  • 為驗證錯誤實作適當的錯誤聚合
  • 與使用 try-catch 的 JavaScript 版本進行比較