Web/GoLang

[golang] errors.Is 재정의시 사용법

벨포트조던 2023. 7. 26.
반응형

자신의 방법을 정의하는 Is또 다른 용도는 다른 인스턴스의 오류를 비교하는 것입니다. 동일한 필드 오류가 있는 특정 필터 인스턴스를 일치시키도록 지정하여 고유한 오류를 패턴 일치시킬 수 있습니다. 다음은 오류 유형을 정의합니다 ResourceErr.

type ResourceErr struct {
    Resource     string
    Code         int
}

func (re ResourceErr) Error() string {
    return fmt.Sprintf("%s: %d", re.Resource, re.Code)
}

임의의 필드가 설정되었을 때 두 인스턴스를 일치시키려면 ResourceErr사용자 정의 메소드를 작성할 수 있습니다 Is.

func (re ResourceErr) Is(target error) bool {
    if other, ok := target.(ResourceErr); ok {
        ignoreResource := other.Resource == ""
        ignoreCode := other.Code == 0
        matchResource := other.Resource == re.Resource
        matchCode := other.Code == re.Code
        return matchResource && matchCode ||
            matchResource && ignoreCode ||
            ignoreResource && matchCode
    }
    return false
}

이때 예를 들어 코드가 무엇이든 모든 오류가 데이터베이스를 가리킨다는 것을 알 수 있습니다.

if errors.Is(err, ResourceErr{Resource: "Database"}) {
    fmt.Println("The database is broken:", err)
    // process the codes
}

 

 

여기서 이해가 안됬던건, is를 재정의 했고, 이걸 쓰는 시점이 언젠지가 이해가 안갔따.

errors.Is( v1, v2 ) 이렇게 파라미터 2개를 받는데, 재정의는 파라미터를 1개를 받는다, 뭔가 자바의 오버라이딩도 아니고 이해가 안갔는데,

 

Is 함수의 원 본체를 찾고 이해했음 

 

func Is(err, target error) bool {
	if target == nil {
		return err == target
	}

	isComparable := reflectlite.TypeOf(target).Comparable()
	for {
		if isComparable && err == target {
			return true
		}
		if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
			return true
		}
		// TODO: consider supporting target.Is(err). This would allow
		// user-definable predicates, but also may allow for coping with sloppy
		// APIs, thereby making it easier to get away with them.
		if err = Unwrap(err); err == nil {
			return false
		}
	}
}

 

 x.Is(target)

위의 이부분이 재정의한걸 쓰는거다. 

 

 

러닝Go 중국어 사이트

https://zhuanlan.zhihu.com/p/618498397

 

云原生系列Go语言篇-错误处理

本文来自正在规划的 Go语言&云原生自我提升系列,欢迎关注后续文章。从其它语言转Go最大的挑战之一就是错误处理。对那些习惯了使用异常的开发者,Go采取的方法有些离经叛道。但Go语言使用

zhuanlan.zhihu.com

 

 

반응형

댓글