item 77 : 예외를 무시하지 말라

예외 처리에서 흔히 저지르는 실수와 올바른 처리 방법

1. 빈 catch 블록의 위험성

  • 문제점:

    • 예외를 무시하면 문제 상황을 적절히 처리하지 못해 오류가 누적될 수 있다.

    • catch 블록은 화재경보를 꺼버리는 것과 같음. 문제를 알리지 않고 숨긴다.

    • 프로그램이 정상적으로 실행되는 것처럼 보이지만, 원인을 파악하기 어려운 지점에서 갑작스러운 오류가 발생할 수 있다.

예시: 나쁜 예외 처리

try {
    // 예외가 발생할 수 있는 코드
} catch (SomeException e) {
    // 아무런 처리를 하지 않음
}

2. 예외를 무시해야 할 경우

  • 예외를 무시해야 할 상황이 존재하긴 하지만, 이는 매우 드물다.

  • 예외를 무시할 경우라도 반드시 그 이유를 명확히 주석으로 남기고, 가능하면 로그를 남겨야 한다.

대표적인 예외 무시 사례

  • 파일 닫기: 입력 전용 스트림을 닫는 과정에서 예외가 발생하더라도 복구할 것이 없으므로 무시 가능.

올바른 예외 무시 예제

try {
    inputStream.close();
} catch (IOException ignored) {
    // 파일 닫는 중 예외 발생: 복구 필요 없음. 로그 작성 가능.
    logger.warn("Failed to close the input stream, but no action needed.");
}
  • ignored 변수 이름 사용: 예외를 명시적으로 무시한다는 의도를 코드에 담는다.

3. 적절한 예외 처리 방안

적절한 대체 조치

  • 예외가 발생했을 때, 프로그램의 기본 동작을 유지할 대체 방안을 마련.

  • 예시: 타임아웃 발생 시 기본값 사용.

Future<Integer> future = executor.submit(task);
int result = DEFAULT_VALUE; // 기본값
try {
    result = future.get(10, TimeUnit.SECONDS); // 타임아웃 설정
} catch (TimeoutException | ExecutionException ignored) {
    // 기본값 사용
    logger.warn("Task timed out. Using default value.");
}

로그 작성

  • 예외 상황을 무시해야 한다면 반드시 로그를 남겨 추후 분석 가능하도록 한다.

  • 예시:

try {
    someMethod();
} catch (SomeException e) {
    logger.error("An exception occurred during someMethod execution", e);
}

가능한 한 예외를 바깥으로 전파

  • 예외를 처리할 책임이 없는 경우, 상위 호출자에게 예외를 전파.

  • 예외를 무시하지 않으면 최소한 디버깅 정보를 남길 수 있음.

예시: 예외 전파

public void process() throws IOException {
    // 상위 호출자가 처리하도록 예외를 던짐
    someMethod();
}

4. 예외 무시에 따른 결과

  • 예외를 적절히 처리하지 않으면 프로그램이 오류를 내재한 채 동작하게 된다.

  • 문제가 누적되다가, 문제의 원인과 상관없는 곳에서 갑작스러운 프로그램 종료가 발생할 수 있다.

  • 예외를 전파하면 디버깅 정보가 남아 오류 원인을 신속히 파악할 수 있다.

5. 예외 처리의 일반 원칙

  1. 예외를 절대 무시하지 말 것:

    • 무시해야 할 경우, 명확한 이유를 주석으로 남기고 로그를 작성.

    • 가능하면 기본 동작으로 대체하거나, 상위 호출자에게 예외를 전파.

  2. API 설계자의 의도를 존중할 것:

    • 메서드 선언에 명시된 예외는 적절히 처리하라는 의도임.

    • 이를 무시하면 프로그램의 안정성과 신뢰성을 해칠 수 있음.

  3. 로그를 활용하라:

    • 예외 발생 시 상황을 기록하여 추후 원인 분석이 가능하도록 한다.

  4. 예외를 처리할 수 없다면 전파하라:

    • 예외를 적절히 처리하지 못할 경우, 바깥으로 전파하여 상위 호출자가 처리하도록 한다.

📚 결론

  • 예외는 문제 상황을 포착하고 적절히 대처하기 위해 존재한다.

  • 예외를 무시하거나 잘못 처리하면 프로그램의 신뢰성과 안정성을 저하시킬 위험이 크다.

  • 예외를 무시하거나 처리할 때는 항상 그 이유를 명확히 하고, 필요한 정보를 기록하여 추후 디버깅이 가능하도록 해야 한다.

Last updated