GO · 함수
에러 래핑 (fmt.Errorf %w)
fmt.Errorf의 %w 동사로 에러를 래핑하여 원인 체인을 유지합니다. errors.Is와 errors.As로 검사합니다.
함수중급error-wrappingfmt-errorferrors-isunwrap
핵심 설명
fmt.Errorf의 %w 동사로 에러를 래핑하여 원인 체인을 유지합니다. errors.Is와 errors.As로 검사합니다.
Go code
package main
import (
"errors"
"fmt"
)
var ErrNotFound = errors.New("not found")
func findUser(id int) error {
if id <= 0 {
return fmt.Errorf("findUser(id=%d): %w", id, ErrNotFound)
}
return nil
}
func getProfile(id int) error {
if err := findUser(id); err != nil {
return fmt.Errorf("getProfile: %w", err)
}
return nil
}
func main() {
err := getProfile(-1)
fmt.Println(err)
// getProfile: findUser(id=-1): not found
// 에러 체인 검사
fmt.Println(errors.Is(err, ErrNotFound)) // true
// Unwrap
fmt.Println(errors.Unwrap(err))
}학습 팁
%w는 에러를 래핑하고, %v는 단순 문자열로 변환합니다. 에러 체인을 유지하려면 반드시 %w를 사용하세요.
주의할 점
fmt.Errorf에 %w를 두 번 이상 사용하면 Go 1.20 미만에서는 컴파일 에러입니다. Go 1.20+에서는 errors.Join을 사용하세요.
자주 묻는 질문
에러 래핑 (fmt.Errorf %w)란 무엇인가요?
fmt.Errorf 의 %w 동사로 에러를 래핑하여 원인 체인을 유지합니다. errors.Is 와 errors.As 로 검사합니다.
에러 래핑 (fmt.Errorf %w) 학습 시 주의할 점은 무엇인가요?
fmt.Errorf 에 %w 를 두 번 이상 사용하면 Go 1.20 미만에서는 컴파일 에러입니다. Go 1.20+에서는 errors.Join 을 사용하세요.