본문 바로가기

프로그래밍/golang

[Golang] errors.Is와 As를 활용한 에러 핸들링

 

Go 언어에서 에러는 단순한 문자열이 아닌 인터페이스로 구성되어 있습니다.
그래서 단순히 에러의 유무만을 판단하는 단계를 넘어,

에러의 타입이나 정보들을 확인하고 값을 직접 꺼내서 사용하는 방법을 알아보겠습니다.

 

1. Sentinel Error 

"Sentinel Error" 는 특정 상태를 나타내기 위해 미리 정의해둔 고정 에러 변수이며 ,

뜻에서 알 수 있듯 '파수꾼'이라는 이름처럼 코드 곳곳에 발생하는 에러들과 비교하는 기준점이 됩니다.

 

특징으로는 패키지 레벨 전역 변수로 선언되며, 주로 에러의 상세 내용보다는 어떤 에러가 발생했는지, 그 종류를 구분할 때 사용합니다.

  • 특징
    • 전역변수 선언
    • 에러 종류 구분에 사용됨
// Example
var ErrInvalidInput = errors.New("invalid input")

 

 

2. Typed Error

 

단순 "에러가 발생했다" 는 사실을 넘어서 어떤 필드에서,

그 에러가 왜 발생했는지에 대한 상세 정보가 필요할 경우가 있습니다.

이때 에러를 구조체로 정의해서 사용하게 되는데, 이러한 것을 "Typed Error" 라고 합니다.

 

// Example
type ValidationError struct {
    Field string // 에러 필드
    Msg   string // 메시지
    Err   error  // 에러
}

func (e *ValidationError) Error() string {
    return fmt.Sprintf("validation: field=%s msg=%s: %v", e.Field, e.Msg, e.Err)
}

func (e *ValidationError) Unwrap() error { return e.Err }

 

 

3. 예제 코드

package main

import (
	"errors"
	"fmt"
)

func main() {
	err := doThing()
	fmt.Println("err:", err)

	var vErr *ValidationError
	// 에러 데이터 추출 (ValidationError -> vErr 할당)
	if errors.As(err, &vErr) {
		fmt.Println("as ValidationError:", "field=", vErr.Field, "msg=", vErr.Msg)
	}

	// 2. 에러 확인
	if errors.Is(err, ErrInvalidInput) {
		fmt.Println("is ErrInvalidInput: true")
	}
}

var ErrInvalidInput = errors.New("invalid input")

type ValidationError struct {
	Field string
	Msg   string
	Err   error
}

func (e *ValidationError) Error() string {
	return fmt.Sprintf("validation: field=%s msg=%s: %v", e.Field, e.Msg, e.Err)
}

func doThing() error {
	return &ValidationError{
		Field: "email",
		Msg:   "missing @",
		Err:   ErrInvalidInput,
	}
}

 

 

4. 비교

종류 errors.Is(err, target) errors.As(err, &target)
목적 에러 비교 에러 추출 (형 변환)

 

 

 

5. 전체 코드 보기

https://github.com/reochoi109/go-handbook/blob/main/error/advanced/typed_as/main.go

 

go-handbook/error/advanced/typed_as/main.go at main · reochoi109/go-handbook

A personal handbook of Go patterns and best practices. Lightweight, practical code snippets for real-world backend development. - reochoi109/go-handbook

github.com