Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ Item77 ] 예외를 무시하지 말라 #73

Open
SooKim1110 opened this issue Jun 18, 2022 · 0 comments
Open

[ Item77 ] 예외를 무시하지 말라 #73

SooKim1110 opened this issue Jun 18, 2022 · 0 comments
Assignees
Labels
10장 예외

Comments

@SooKim1110
Copy link

[ Item77 ] 예외를 무시하지 말라

예외는 문제 상황에 잘 대처하기 위해 존재한다!

API 설계자가 메서드 선언에 예외를 명시하는 이유는 그 메서드를 사용할 때 적절한 조치를 취해달라고 말하는 것이다. 이를 무시하지 말자.
메서드 호출을 try문으로 감싸고 catch 블록에서 아무 일도 하지 않으면 예외를 쉽게 무시할 수 있지만, 그러면 예외가 존재할 이유가 없어진다.
빈 catch 블록을 목격한다면 머릿속에 사이렌🚨 을 울려야 한다!!

예외를 무시해야할 경우

예를 들어 FileInputStream을 닫을 때(close())는 예외를 무시해도 된다.
(FileInputStream: https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html)

  • FileInputSteam은 자바에서 이미지 데이터 등을 바이트 단위로 파일을 읽을 때 사용하는 클래스이다.
  • 파일의 상태를 변경하지 않았으니 닫을 때 예외가 발생해도 복구할 것이 없다.
  • 스트림을 닫는다는 것은 필요한 정보를 다 읽었다는 의미이므로 남은 작업을 중단할 이유가 없다.

📌 이렇게 예외를 무시할 수 있는 상황이라면 catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수 이름도 ignore를 사용하자!

예시)

Future<Integer> f = exec.submit(planarMap::chromaticNumber);
int numColors = 4;
try {
    numColors = f.get(1L, TimeUnit.SECONDS);
} catch (TimeoutException | ExecutionException ignored) {
    //기본값을 사용한다(색상 수를 최소화하면 좋지만, 필수는 아니다).
}
  • 위의 예시에서는 Future를 이용한 비동기 연산을 하고 있다. Future를 사용하면 멀티스레드 환경에서 처리된 데이터를 다른 스레드에 전달할 수 있다. (Future에 대해 이해하기 좋은 글: https://codechacha.com/ko/java-future/)
  • 색칠하는데 필요한 최소 색깔 개수를 numColors 를 f.get()으로 계산하고 있지만 1초가 넘으면 그냥 기본값이 4개를 사용하고 있다(모든 planar map은 4개 색이 있으면 칠할 수 있으므로. 다른 이야기긴 하지만 이에 대해 더 궁금하면 https://en.wikipedia.org/wiki/Four_color_theorem를 읽어보자).
  • 계산 시간이 1초를 넘겨 발생하는 예외 상황에서 따로 할 일이 없으므로 예외를 ignored 변수로 catch한다.

핵심 정리

  • 검사와 비검사 예외 모두에서 예외가 발생했을 때 무시하면 안된다!
  • 빈 catch 블록으로 지나가면 프로그램은 오류를 내제한 채 동작하게 되고, 문제 원인과 상관없는 곳에서 문제가 생길 수 있다.
  • 예외를 적절히 처리하면 오류를 완전히 피할수도 있고, 바깥으로 전파되게만 놔둬도 디버깅 정보를 남긴 채 프로그램이 신속히 중단되게 할 수 있다.
  • 예외를 무시할 수 있는 상황이라면 catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수 이름도 ignore를 사용하자.
@SooKim1110 SooKim1110 added the 10장 예외 label Jun 18, 2022
@SooKim1110 SooKim1110 self-assigned this Jun 18, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
10장 예외
Projects
None yet
Development

No branches or pull requests

1 participant