PHpullh
학습 라이브러리/Go/에러 래핑 (fmt.Errorf %w)

GO · 함수

에러 래핑 (fmt.Errorf %w)

fmt.Errorf%w 동사로 에러를 래핑하여 원인 체인을 유지합니다. errors.Iserrors.As로 검사합니다.

함수중급error-wrappingfmt-errorferrors-isunwrap

핵심 설명

fmt.Errorf%w 동사로 에러를 래핑하여 원인 체인을 유지합니다. errors.Iserrors.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 을 사용하세요.