PHpullh
학습 라이브러리/Go/errors.Is와 errors.As

GO · 함수

errors.Is와 errors.As

errors.Is는 에러 체인에서 특정 에러를 찾고, errors.As는 특정 타입을 추출합니다.

함수중급errors-iserrors-assentinelerror-chain

핵심 설명

errors.Is는 에러 체인에서 특정 에러를 찾고, errors.As는 특정 타입을 추출합니다.

Go code

package main

import (
	"errors"
	"fmt"
	"io/fs"
	"os"
)

func main() {
	// errors.Is — 센티널 에러 비교
	_, err := os.Open("없는파일.txt")

	if errors.Is(err, fs.ErrNotExist) {
		fmt.Println("파일이 존재하지 않습니다")
	}

	// errors.As — 타입 추출
	var pathErr *fs.PathError
	if errors.As(err, &pathErr) {
		fmt.Println("경로:", pathErr.Path)
		fmt.Println("작업:", pathErr.Op)
	}

	// 래핑된 에러에서도 동작
	wrapped := fmt.Errorf("설정 로드 실패: %w", err)
	fmt.Println(errors.Is(wrapped, fs.ErrNotExist)) // true

	var pe *fs.PathError
	fmt.Println(errors.As(wrapped, &pe)) // true
}

학습 팁

errors.Is는 래핑된 에러 체인을 따라가며 비교합니다. == 대신 항상 errors.Is를 사용하세요.

주의할 점

err == ErrNotFound처럼 직접 비교하면 래핑된 에러를 감지할 수 없습니다. 항상 errors.Is를 사용하세요.

자주 묻는 질문

errors.Is와 errors.As란 무엇인가요?

errors.Is 는 에러 체인에서 특정 에러를 찾고, errors.As 는 특정 타입을 추출합니다.

errors.Is와 errors.As 학습 시 주의할 점은 무엇인가요?

err == ErrNotFound 처럼 직접 비교하면 래핑된 에러를 감지할 수 없습니다. 항상 errors.Is 를 사용하세요.