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 중국어 웹사이트의 기타 관련 기사를 참조하세요!