>백엔드 개발 >Golang >Go의 `Is()` 및 `As()` 함수는 재귀 오류 래핑을 어떻게 처리합니까?

Go의 `Is()` 및 `As()` 함수는 재귀 오류 래핑을 어떻게 처리합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-16 10:52:10691검색

How Do Go's `Is()` and `As()` Functions Handle Recursive Error Wrapping?

Go 오류: Is() 및 As()의 미스터리 풀기

Go에서 오류 처리는 의미 있는 진단을 제공하고 강력한 프로그램을 구현합니다. 오류 패키지는 각각 오류 동일성을 결정하고 특정 세부 정보를 추출하기 위한 Is() 및 As() 함수를 제공합니다. 일반적인 오해 중 하나는 이러한 함수가 재귀 오류 래핑을 지원하여 중첩된 여러 오류의 래핑 해제를 가능하게 한다는 것입니다.

그러나 자세히 살펴보면 표준 fmt.Errorf 함수는 재귀 오류 래핑을 제공하지 않습니다. 이는 %w를 사용하여 오류를 래핑하면 오류 체인의 전체 탐색이 허용되지 않음을 의미합니다.

이 문제를 해결하려면 오류 인터페이스를 구현하고 자체 Is() 및 As() 메소드. 이를 통해 중첩된 여러 오류를 재귀적으로 래핑 해제할 수 있습니다.

예:

type customError struct {
    err     error
    wrapped *customError
}

func (c *customError) Error() string {
    if c.err != nil {
        return c.err.Error()
    }
    return "Custom error without cause"
}

func (c *customError) Is(err error) bool {
    if c.err != nil {
        return errors.Is(c.err, err)
    }
    return false
}

func (c *customError) As(target interface{}) bool {
    if c.err != nil {
        return errors.As(c.err, target)
    }
    return false
}

func Wrap(errs ...error) error {
    var rootError *customError
    for i := len(errs) - 1; i >= 0; i-- {
        rootError = &customError{
            err:     errs[i],
            wrapped: rootError,
        }
    }
    return rootError
}

이 사용자 정의 오류 유형을 사용하면 여러 오류를 쉽게 래핑 및 래핑 해제하고 반복적인 Is() 및 As를 수행할 수 있습니다. () 확인:

err := Wrap(Err1, Err2, Err3)
fmt.Println(errors.Is(err, Err1)) // true
fmt.Println(errors.Is(err, Err3)) // false

var errType ErrType
errors.As(err, &errType)
fmt.Println(errType) // "my error type"

이 사용자 정의 구현은 재귀적 오류 래핑 해제를 제공하지만 현재는 이 기능을 즉시 제공하는 Go 표준 라이브러리의 내장 유형입니다. 그러나 github.com/pkg/errors와 같은 라이브러리는 재귀적 언래핑을 포함하여 자신의 프로젝트에서 고려해 볼 만한 추가 오류 처리 기능을 제공합니다.

위 내용은 Go의 `Is()` 및 `As()` 함수는 재귀 오류 래핑을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.