Go의 에러 래핑을 다시 본다
fmt.Errorf의 %w는 에러를 감싸면서 원본을 잃지 않는다.
코드
func loadConfig(path string) (*Config, error) {
f, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("설정 파일 열기 실패 %q: %w", path, err)
}
defer f.Close()
var cfg Config
if err := json.NewDecoder(f).Decode(&cfg); err != nil {
return nil, fmt.Errorf("설정 파싱 실패: %w", err)
}
return &cfg, nil
}
표
| 함수 | 쓰는 때 |
|---|---|
errors.Is | 특정 센티넬 에러인지 확인 |
errors.As | 구체 타입으로 꺼내야 할 때 |
errors.Join | 여러 에러를 한꺼번에 |
%w를 여러 번 쓰면 트리가 된다. 깊어지면 읽기 어려워지니 한 계층에 하나면 충분하다.