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 |