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

[Item 71] 필요 없는 검사 예외 사용은 피하라 #71

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

[Item 71] 필요 없는 검사 예외 사용은 피하라 #71

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

Comments

@SooKim1110
Copy link

[ Item71 ] 필요 없는 검사 예외 사용은 피하라

검사 예외 vs 비검사 예외

자바 Throwable

스크린샷 2022-06-12 오후 4 12 11

검사 예외(Checked Exception / Compile Time Exception)

  • 수행 중에 일어날 예외를 검사하고 대비하는 목적
  • 반드시 예외처리를 해야한다 (try/catch or throws 사용)
    예) IOException, NoSuchFieldException ...

비검사 예외(Unchecked Exception / Runtime Exception)

  • Error는 시스템적인 예외를 의미. 복구 불가능한 상황에서 발생하는 예외
  • 컴파일러가 예외 처리 여부를 확인하지 않는다
    예) NullPointerException, IndexOutOfBoundsException...

더 자세한 정보는 https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html 공식 문서를 참고하자.

검사 예외

검사 예외는 발생한 문제를 프로그래머가 처리하기 때문에 안정성을 높일 수 있다.
하지만! 검사 예외를 과하게 사용하면 쓰기 불편한 API가 된다.

  • 검사 예외를 던지는 메서드를 호출하는 코드에서는 catch 블록으로 예외를 잡아 처리하거나 더 바깥으로 던져 문제를 전파해야한다
  • 검사예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없다.
  • 특히, 메서드가 검사 예외를 하나만 던질 경우, 그 예외 때문에 try 블록을 추가해야하고, 스트림에서 직접 사용하지 못한다.

=> 그래서, API를 제대로 사용해도 발생할 수 있는 예외가 있거나 프로그래머가 예외에 대한 의미 있는 조치를 취할 수 있는 경우가 아니라면 비검사 예외를 사용하는 것이 좋다.

검사 예외 회피

  1. 적절한 결과 타입을 담은 Optional 반환
    빈 Optional을 반환한다
    하지만, 이 방법으로는 예외가 발생한 이유를 알려주는 부가 정보를 담을 수 없다 (예외를 사용하면 구체적인 예외 타입 & 부가 정보를 제공할 수 있다)

  2. 검사 예외를 던지는 메서드를 2개로 쪼개 비검사 예외로 바꾼다

// 전
try {
	obj.action(args);
} catch (TheCheckedException e) {
	... // 예외처리
}

// 후
if(obj.actionPermitted(args)){ // 가능한지 먼저 확인하는 메서드
	obj.action(args);
} else {
	... // 예외처리
}

모든 상황에 적용할 수 있는 리팩토링은 아니지만, 더 쓰기 편한/ 유연한 API를 제공할 수 있다.
메서드가 성공할 것을 알거나 실패시 스레드를 중단하길 원한다면 obj.action(args)로 한 줄로 작성할 수 있다.

⚠️ 주의

  • actionPermitted는 상태 검사 메서드에 해당하므로 주의해야한다. 외부 동기화 없이 여러 스레드가 동시에 접근할 수 있거나, 외부 요인에 의해 상태가 변화할 수 있다면 이 리팩토링은 적절하지 않다. (actionPermitted와 action 호출 사이에 객체 상태가 변할 수 있다)
  • actionPermitted가 action의 작업 일부를 중복 수행하면 성능면에서 손해라 리팩터링이 적절하지 않다.

핵심 정리

  • 검사 예외는 꼭 필요한 곳에서만 사용하자!
    1. API 호출자가 예외 상황에서 복구할 방법이 없다면 비검사 예외 사용
    1. 복구가 가능하고 호출자가 처리를 해주길 바란다면 옵셔널 사용
    1. 옵셔널만으로는 충분한 정보를 제공할 수 없을 때 검사 예외 사용
@SooKim1110 SooKim1110 self-assigned this Jun 12, 2022
@SooKim1110 SooKim1110 added the 10장 예외 label Jun 12, 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