나무아래의 잡동사니

Go의 에러 래핑을 다시 본다

1분goerror

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를 여러 번 쓰면 트리가 된다. 깊어지면 읽기 어려워지니 한 계층에 하나면 충분하다.