예외를 무시하지 말라
매우 뻔한 얘기같지만 생각보다 사람들이 자주 어기는 부분이다.
API 설계자가 메서드 선언에 예외를 명시하는 이유는 그 메서드를 사용할 때 적절한 조치를 취해달라고 어필하기 위함이다.
예외를 무시하는 것은 아주 쉽다. try로 감싼 뒤 catch 블록에서 아무 일도 하지 않으면 된다.
catch 블록은 문제 상황에 대처하기 위해 존재하는 것이다. catch 블록을 비워두면 예외가 존재하는 이유가 없어진다.
운이 좋아 별일이 없으면 다행이지만, 끔찍한 경우로 이어질 수 있다.
예외를 무시해야 하는 경우
예외를 무시해야 하는 경우도 있다.
예를 들면 FileInputStream을 닫을 때 같은 경우이다.
입력 전용 스트림이기 때문에 파일의 상태를 변경하지 않아 복구할 것이 없다.
스트림을 닫는 것 또한 필요한 정보는 이미 다 읽었다는 뜻이므로 남은 작업을 중단할 이유또한 없다.
이러한 경우에도 예외를 무시하기로 결정했다면, catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수의 이름도 ignored로 바꿔놓는 것이 좋다.
1
2
3
4
5
6
7
8
Future<Integer> f = exec.submit(planarMap::chromaticNumber);
int numColors = 4; // 기본 값으로 어떤 지도라도 이 값이면 충분하다.
try {
numColors = f.get(1L, TimeUnit.SECONDS);
} catch (TimeoutException | ExecutionException ignored) {
// 기본 값을 사용한다. (색상 수를 최소화하면 좋지만, 필수는 아니다.)
}
예외를 아예 처리하지 않을 경우?
예외를 만약 처리하지 않으면 프로그램은 오류를 내재한 채 동작하게 된다.
그러다 어느 순간 문제의 원인과 아무런 상관이 없는 곳에서 갑자기 프로그램이 죽어버릴 수 있다. 그러면 원인을 찾기 힘들다.
예외를 적절하게 처리한다면 오류를 완전히 피할 수도 있다.
오류를 당장 처리할 수 없다면 무시하지 말고 바깥으로 전파하게라도 하자. 최소한 디버깅 정보를 남긴 채 프로그램이 신속하게 중단되도록 할 수 있다.
정리
예외는 절대 무시하지 말자.
catch로 예외를 잡고 아무 일도 하지 않는 것은 반드시 피해야 하며 만약 의도적으로 그랬을 경우에는 그 근거를 주석으로 남기자.
오류를 처리할 수 없다면 바깥으로 전파라도 하고, 최소한 어떤 오류인지라도 파악할 수 있도록 만들자.