Go 오류: Is() 및 As() 재귀적 오류 래핑 지원
Go에서 오류 처리는 오류 관리 및 분석에 매우 중요합니다. 응용 프로그램 전반에 걸쳐. 오류 인터페이스는 오류를 나타내는 일반적인 방법을 제공하며 오류 검사를 위한 Is() 및 As()와 같은 메서드를 포함합니다.
그러나 표준 오류 인터페이스는 재귀 오류 래핑을 지원하지 않는다는 점에 유의하는 것이 중요합니다. . 즉, fmt.Errorf를 사용하여 오류를 래핑하는 경우 Is() 및 As()를 사용하여 기본 오류를 재귀적으로 확인할 수 없습니다.
재귀 오류에 대한 사용자 정의 오류 유형 래핑
재귀적 오류 래핑을 달성하려면 오류 인터페이스를 구현하는 사용자 정의 오류 유형을 생성할 수 있습니다. 이 유형은 래핑된 오류에 대한 참조를 포함해야 하며 사용자 지정 Is() 및 As() 메서드를 정의하여 재귀 비교를 활성화해야 합니다.
다음은 재귀 오류 유형의 구현 예입니다.
type errorChain struct { err error next *errorChain } func (c errorChain) Is(err error) bool { // Check the current error against the given error if c.err == err { return true } // Check if there is a wrapped error and recursively call Is() if c.next != nil { return c.next.Is(err) } return false } func (c errorChain) As(target interface{}) bool { // Check if the current error As() to the target interface if errors.As(c.err, target) { return true } // Check if there is a wrapped error and recursively call As() if c.next != nil { return c.next.As(target) } return false }
재귀적으로 오류 래핑
사용자 정의 오류 유형을 정의한 후에는 다음과 같은 함수를 사용하여 오류를 재귀적으로 래핑할 수 있습니다.
func Wrap(errs ...error) error { if len(errs) == 0 { return nil } // Create the first error in the chain out := &errorChain{err: errs[0]} // Iterate over the remaining errors for _, err := range errs[1:] { // Link the errors together out.next = &errorChain{err: err} out = out.next } return out }
Usage
이제 이 사용자 정의 오류 유형을 사용하여 오류를 래핑하고 기본 오류를 확인할 수 있습니다. Is()와 As()를 재귀적으로 사용합니다. 예:
var Err1 = errors.New("error 1") var Err2 = errors.New("error 2") var Err3 = errors.New("error 3") err := Wrap(Err1, Err2, Err3) fmt.Println(errors.Is(err, Err2)) // true fmt.Println(errors.Is(err, Err3)) // true fmt.Println(errors.Is(err, Err0)) // false
결론
재귀 Is() 및 As() 메서드를 사용하여 사용자 정의 오류 유형을 생성하면 재귀 오류 래핑을 달성하고 수행할 수 있습니다. Go 애플리케이션에서 오류를 더욱 정확하게 처리할 수 있습니다.
위 내용은 Go에서 Is() 및 As()를 사용하여 재귀 오류 래핑을 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!