>백엔드 개발 >Golang >Go에서 Is() 및 As()를 사용하여 재귀 오류 래핑을 어떻게 달성할 수 있나요?

Go에서 Is() 및 As()를 사용하여 재귀 오류 래핑을 어떻게 달성할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-11 10:42:11302검색

How Can I Achieve Recursive Error Wrapping with Is() and As() in Go?

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

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