在Go 中處理多層抽象層次結構中的錯誤
在Go 中,當使用多個抽象層級時,錯誤處理變得至關重要用於維護乾淨且可維護的程式碼庫。防止重複的錯誤訊息並確保以有意義的方式處理錯誤至關重要。
包裝錯誤
建議的方法是使用錯誤包裝或類似的包裝錯誤工具。此技術涉及建立一個包裝原始錯誤的新錯誤值,在抽象層次結構的每個層級提供上下文。
註解錯誤範例
請考慮使用以下範例錯誤套件:
func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return errors.New("Object1 illegal state: value is 0") } return nil } func (oT *ObjectTwoHigherLevel) CheckObjectOneIsReady() error { if err := oT.objectOne.CheckValue(); err != nil { return errors.Wrap(err, "Object2 illegal state: Object1 is invalid") } return nil } func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return errors.Wrap(err, "Object3 illegal state: Object2 is invalid") } return nil }
在此範例中,錯誤包裝在每個層級,提供了清晰的上下文線索錯誤的根本原因。
fmt.Errorf() 擴充
作為包裝錯誤的替代方法,您也可以使用 fmt.Errorf( )。這種方法比較簡單,但不允許您提取原始錯誤。
func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return fmt.Errorf("Object1 illegal state: value is %d", o.someValue) } return nil } func (oT *ObjectTwoHigherLevel) CheckObjectOneIsReady() error { if err := oT.objectOne.CheckValue(); err != nil { return fmt.Errorf("Object2 illegal state: %v", err) } return nil } func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return fmt.Errorf("Object3 illegal state: %v", err) } return nil }
錯誤處理與委託
考慮錯誤是否應該被處理是很重要的處理或委託給更高級別。處理錯誤涉及檢查錯誤並採取特定操作,而委託將責任傳遞給呼叫者。如果呼叫者能夠更好地處理錯誤或錯誤只是提供訊息,則首選委派。
記錄錯誤訊息
記錄錯誤訊息時,請確保您提供有關錯誤及其上下文的足夠詳細資訊。使用錯誤的錯誤字串和任何可用的附加資訊來清楚地識別問題的根本原因。
以上是如何有效處理Go多層抽象層次結構中的錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!