티스토리 뷰

(Effective Java) 규칙77. 예외를 무시하지 말라


예외 무시의 위험성


  • 너무 뻔한 조언 같지만 사람들이 자주 어기고 있다.

  • API 설계자가 메서드 선언에 예외를 명시하는 까닭은, 그 메서드를 사용할 때 적절한 조취를 취해달라고 말하는 것이다.

    • API 설계자의 목소리를 흘려버리지 말자.
  • 안타깝게도 예외를 무시하기란 아주 쉽다.

    • 해당 메서드 호출을 try문으로 감싼 후 catch 블록에서 아무 일도 하지 않으면 끝임

      // catch 블록을 비워두면 예외가 무시된다. 아주 의심스러운 코드다!
      try {
          ...
      } catch (SomeException e) {
      }
  • 예외는 문제 상황에 잘 대처하기 위해서 존재하는데 catch 블록을 비워두면 예외가 존재할 이유가 없어진다.

    • 운이 좋아 별 탈이 없으면 다행이지만 끔찍한 참사로 이어질 수 있음
  • catch 블록을 목격한다면 여러분 머릿속에 사이렌을 울려야 한다.

 

예외를 무시해야 할 때


  • 물론 예외를 무시해야 할 때도 있다.

    • 예) FileInputStream을 닫을 때
      • (입력 전용 스트림이므로) 파일의 상태를 변경하지 않았으니 복구할 것이 없음
      • (스트림을 닫는다는 건) 필요한 정보는 이미 다 읽었다는 뜻이니 남은 작업을 중단할 이유도 없음
  • 예외를 무시하기로 했다면 catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수 이름도 ignore로 바꿔놓도록 하자 .

    Future<Integer> f = exec.submit(planarMap::chromaticNumber);
    int numColors = 4;
    try {
        numColors = f.get(1L, TimeUnit.SECONDS);
    } catch (TimeoutException | ExecutionException ignored) {
        //기본값을 사용한다(색상 수를 최소화하면 좋지만, 필수는 아니다).
    }

 

정리


  • 이번 내용은 검사와 비검사 예외에 똑같이 적용된다.

    • 예측할 수 있는 예외 상황이든 프로그래밍 오류든, 빈 catch 블록으로 못 본 척 지나치면 그 프로그램은 오류를 내재한 채 동작하게 됨
    • 그러다 어느 순간 문제의 원인과 아무 상관없는 곳에서 갑자기 죽어버릴 수 있음
  • 예외를 적절히 처리하면 오류를 완전히 피할 수도 있음

    • 무시하지 않고 바깥으로 전파되게만 놔둬도 최소한 디버깅 정보를 남긴 채 프로그램이 신혹시 중단되게는 할 수 있음

 

결론


  • 예외를 무시하지 말자.

     


끝으로

이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다! 

반응형
댓글