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.Is와 errors.As가 에러 체인을 탐색합니다.
주의할 점
커스텀 에러를 값 리시버로 Error()를 구현하면 errors.As에서 포인터와 값 모두 매칭되어 혼란을 줄 수 있습니다.
자주 묻는 질문
커스텀 에러 타입과 인터페이스란 무엇인가요?
error 인터페이스를 구현하는 구조체로 풍부한 에러 정보를 전달합니다.
커스텀 에러 타입과 인터페이스 학습 시 주의할 점은 무엇인가요?
커스텀 에러를 값 리시버로 Error() 를 구현하면 errors.As 에서 포인터와 값 모두 매칭되어 혼란을 줄 수 있습니다.