多層抽像中的錯誤傳播
在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中文網其他相關文章!