Golang

Error Is, As

GenieLove! 2022. 10. 15. 00:37
728x90
반응형

errors.go

func Errorf(format string, a ...any) error {
	p := newPrinter()
	p.wrapErrs = true
	p.doPrintf(format, a)
	s := string(p.buf)
	var err error
	if p.wrappedErr == nil {
		err = errors.New(s)
	} else {
		err = &wrapError{s, p.wrappedErr}
	}
	p.free()
	return err
}

type wrapError struct {
	msg string
	err error
}

func (e *wrapError) Error() string {
	return e.msg
}

func (e *wrapError) Unwrap() error {
	return e.err
}

Errorf

func Errorf(format string, a ...any) error

- 포맷을 지정하여 에러를 반환

- %w와 같이 사용하면, 기존 에러와 새로운 에러 메시지를 합해준다.

Unwrap

- fmt.Errorf로 래핑된 에러를 언래핑하는 것으로 errors.Unwrap(err)를 하게 되면 err의 Unwrap()함수를 호출한다. 없으면 nil반환

package main

import (
	"errors"
	"fmt"
)

func main() {
	err1 := errors.New("error1")
	err2 := fmt.Errorf("error2: [%w]", err1)
	fmt.Println(err2)
	fmt.Println(errors.Unwrap(err2))
	// Output
	// error2: [error1]
	// error1
}

Is()

- sentinel 에러 비교와 같다.

- Unwrap을 반복적으로 호출하여 얻은 오류 객체로 구성된다.

* sentinel error : 첫번째 에러 카테고리로 최상위 부모 객체라고 볼 수 있다.

As()

- Is() 함수와 비슷하게, 래핑된 오류 체인과 오류 대상이 일치하는지 확인

- As() 함수는 특정한 오류 구조체인지 확인

- 간단히 요약하면, As()는 상속받은 부모 객체로도 검사가 되고, Is()는 최상위 부모 객체로만 검사된다.

- if _, ok := err.(*ent.NotFoundError); ok ~ 와도 같은 의미

728x90
반응형

'Golang' 카테고리의 다른 글

[Golang] interface 타입 nil 체크  (3) 2023.02.09
[Golang] iota  (0) 2022.11.20
[Golang] Closure  (0) 2022.04.18
[Golang] 채널, 컨텍스트  (0) 2022.04.18
[Golang] 고루틴과 동시성  (0) 2022.04.17