다층 추상화의 오류 전파
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
이것 접근 방식은 오류 주석보다 덜 다양하지만 구현이 더 간단합니다.
위 내용은 Multi-Layer Go 추상화에서 오류 전파를 효과적으로 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!