首頁 > 後端開發 > Golang > 如何有效處理Go多層抽像中的錯誤?

如何有效處理Go多層抽像中的錯誤?

DDD
發布: 2024-12-22 20:16:10
原創
482 人瀏覽過

How Can I Effectively Handle Errors in Go's Multi-Level Abstractions?

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板