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

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

Susan Sarandon
Susan Sarandon原創
2024-12-12 18:21:11665瀏覽

How Can I Effectively Handle Error Propagation in Multi-Layer Go Abstractions?

多層抽像中的錯誤傳播

在Go 中,跨多個抽象層級的錯誤處理可能會成為一個挑戰,因為需要不斷向上傳遞錯誤。這通常會導致重複的日誌訊息或遺失上下文資訊。

建議解決方案:錯誤註釋

錯誤處理的首選方法是按原樣註釋錯誤通過不同的抽象層級。這允許保留原始錯誤的上下文,同時在每個層級添加附加資訊。

使用像「github.com/pkg/errors」這樣的函式庫,錯誤處理可以實現為如下:

// Wraps the original error with additional context.
func (o *ObjectOne) CheckValue() error {
    if o.someValue == 0 {
        return errors.New("Object1 illegal state: value is 0")
    }
    return nil
}

// Annotates the original error with context.
func (oT *ObjectTwoHigherLevel) CheckObjectOneIsReady() error {
    if err := oT.objectOne.CheckValue(); err != nil {
        return errors.Wrap(err, "Object2 illegal state: Object1 is invalid")
    }
    return nil
}

// Preserves the annotated error stack.
func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error {
    if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil {
        return errors.Wrap(err, "Object3 illegal state: Object2 is invalid")
    }
    return nil
}

用法:

o3 := &ObjectThreeHiggerLevel{}
if err := o3.CheckObjectTwoIsReady(); err != nil {
    fmt.Println(err)
}

輸出:

Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0

這種方法提供了一個乾淨的資訊豐富的錯誤處理機制,避免重複記錄並保留上下文資訊。

替代方案:錯誤擴充

為了簡單起見,另一種方法是使用附加上下文來擴充原始錯誤fmt.Errorf():

func (o *ObjectOne) CheckValue() error {
    if o.someValue == 0 {
        return fmt.Errorf("Object1 illegal state: value is %d", o.someValue)
    }
    return nil
}

用法:

o3 := &ObjectThreeHiggerLevel{}
if err := o3.CheckObjectTwoIsReady(); err != nil {
    fmt.Println(err)
}

輸出:

Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0

輸出:

這個方法不如錯誤。但實作起來更簡單。

以上是如何有效處理多層 Go 抽像中的錯誤傳播?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn