> 백엔드 개발 > Golang > Go에서 진정한 재귀 오류 래핑 및 언래핑을 어떻게 달성할 수 있나요?

Go에서 진정한 재귀 오류 래핑 및 언래핑을 어떻게 달성할 수 있나요?

Susan Sarandon
풀어 주다: 2024-12-12 14:52:10
원래의
575명이 탐색했습니다.

How Can I Achieve True Recursive Error Wrapping and Unwrapping in Go?

Go에서 재귀 Is() 및 As()로 오류 래핑

많은 개발자는 %w 동사와 함께 fmt.Errorf를 사용하여 Go에서 오류 래핑을 권장하지만 이는 메서드는 진정한 재귀적 래핑을 제공하지 않습니다. Is() 및 As()를 사용하여 오류를 재귀적으로 확인하려면 사용자 정의 오류 유형을 사용할 수 있습니다.

재귀에 대한 사용자 정의 오류 유형

다음은 오류 래핑 및 재귀 검사를 지원하는 사용자 정의 오류 유형 errorChain입니다. :

type errorChain struct {
    err  error
    next *errorChain
}

func Wrap(errs ...error) error {
    out := errorChain{err: errs[0]}

    n := &out
    for _, err := range errs[1:] {
        n.next = &errorChain{err: err}
        n = n.next
    }
    return out
}
로그인 후 복사

사용자 정의에 Is() 및 As() 추가 유형

재귀 검사를 활성화하는 핵심은 사용자 정의 유형에 Is() 및 As() 메서드를 모두 구현하는 것입니다. 이러한 방법을 사용하면 체인 자체가 아닌 체인 내에 포함된 오류에서 오류를 비교할 수 있습니다.

func (c errorChain) Is(err error) bool { return errors.Is(c.err, err) }

func (c errorChain) As(target any) bool { return errors.As(c.err, target) }
로그인 후 복사

errorChain 사용

이러한 방법을 사용하면 오류를 래핑하고 재귀 검사를 수행할 수 있습니다. :

errs := Wrap(errors.New("error 0"), errors.New("error 1"), errors.New("error 2"))

fmt.Println(errors.Is(errs, errors.New("error 0")))  // true
fmt.Println(errors.Is(errs, errors.New("error 1")))  // true
fmt.Println(errors.Is(errs, errors.New("error 2")))  // true
로그인 후 복사

Unwrap()을 사용하여 체인 반복

errorChain의 Unwrap() 메소드를 사용하면 체인의 래핑된 오류를 탐색할 수 있습니다.

var currentError error = errs
for {
    currentError = errors.Unwrap(currentError)
    if currentError == nil {
        break
    }
    fmt.Println(currentError)
}
로그인 후 복사

이 예는 체인의 모든 오류를 인쇄합니다.

error 0
error 1
error 2
로그인 후 복사

위 내용은 Go에서 진정한 재귀 오류 래핑 및 언래핑을 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿