PHpullh
학습 라이브러리/Go/커스텀 에러 타입과 인터페이스

GO · 에러처리

커스텀 에러 타입과 인터페이스

error 인터페이스를 구현하는 구조체로 풍부한 에러 정보를 전달합니다.

에러처리중급custom-errorunwrapapp-errorstructured

핵심 설명

error 인터페이스를 구현하는 구조체로 풍부한 에러 정보를 전달합니다.

Go code

package main

import (
	"errors"
	"fmt"
	"time"
)

type AppError struct {
	Code    int
	Message string
	Op      string // 실패한 작업
	Time    time.Time
	Err     error // 원인 에러
}

func (e *AppError) Error() string {
	return fmt.Sprintf("[%d] %s: %s", e.Code, e.Op, e.Message)
}

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

func newAppError(code int, op, msg string, err error) *AppError {
	return &AppError{
		Code: code, Message: msg,
		Op: op, Time: time.Now(), Err: err,
	}
}

func fetchData() error {
	return newAppError(503, "fetchData", "서비스 불가", nil)
}

func main() {
	err := fetchData()
	fmt.Println(err)

	var appErr *AppError
	if errors.As(err, &appErr) {
		fmt.Printf("코드: %d, 작업: %s, 시각: %s\n",
			appErr.Code, appErr.Op, appErr.Time.Format("15:04:05"))
	}
}

학습 팁

Unwrap() error 메서드를 구현하면 errors.Iserrors.As가 에러 체인을 탐색합니다.

주의할 점

커스텀 에러를 값 리시버로 Error()를 구현하면 errors.As에서 포인터와 값 모두 매칭되어 혼란을 줄 수 있습니다.

자주 묻는 질문

커스텀 에러 타입과 인터페이스란 무엇인가요?

error 인터페이스를 구현하는 구조체로 풍부한 에러 정보를 전달합니다.

커스텀 에러 타입과 인터페이스 학습 시 주의할 점은 무엇인가요?

커스텀 에러를 값 리시버로 Error() 를 구현하면 errors.As 에서 포인터와 값 모두 매칭되어 혼란을 줄 수 있습니다.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.