在Go 中處理多層抽像中的錯誤
當錯誤反覆向上傳遞時,多層次抽像中的錯誤處理可能會變得很麻煩鏈,導致重複日誌和遺失上下文。
註解錯誤
註解錯誤是建議的方法。它涉及創建一個新的錯誤值來包裝原始錯誤,從而提供額外的上下文。 Errors 套件為此目的提供了 Wrap() 和 Cause() 函數。
在給定的範例中:
// ObjectThreeHiggerLevel func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return errors.Wrap(err, "Object3 illegal state: Object2 is invalid") } return nil }
ObjectThreeHiggerLevel 使用附加上下文註解來自 ObjectTwoHigherLevel 的錯誤。
「延長」錯誤
另一種方法是使用 fmt.Errorf()「擴充」錯誤。雖然它不提供錯誤解包功能,但它允許您建立帶有添加上下文的自訂錯誤訊息:
// ObjectThreeHiggerLevel func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return fmt.Errorf("Object3 illegal state: %v", err) } return nil }
委派或處理錯誤
處理錯誤時,決定是處理它們還是將它們委託給更高層級很重要。如果未處理錯誤,則應使用新增的上下文來委託它,以避免遺失資訊或導致重複日誌。
在範例中:
// ObjectThreeHiggerLevel func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { if err := oTh.HandleError(err); err != nil { // Error handling failed, log and return original error return errors.Wrapf(err, "Object3 failed to handle error: %v", err) } return nil } return nil }
在此範例中,HandleError() 嘗試來處理錯誤。如果失敗,原始錯誤將被包裝並返回。
避免重複日誌
使用上下文註釋或擴展錯誤可確保當錯誤在堆疊上傳播時,它包含有意義的日誌記錄和錯誤處理所需的所有資訊。這可以防止重複日誌並有助於了解問題的根本原因。
以上是如何有效處理Go多層抽像中的錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!