예외 던지기(exception re-throwing) 란?
한 메서드에서 발생할 수 있는 예외가 여럿인 경우
몇 개는 try-catch문을 통해서 메서드 내에서 자체적으로 처리하고,
그 나머지는 선언부에 지정하여 호출한 메서드에서 처리하도록 함으로써, 양쪽에서 나눠서 처리되도록 할 수 있다.
그리고 단 하나의 예외에 대해서도 예외가 발생한 메서드와 호출한 메서드,
양쪽에서 처리하도록 할 수 있다.
이것은 예외를 처리한 후에 인위적으로 다시 발생시키는 방법을 통해서 가능한데, 이것을 예외 되던지기(exception re-throwing)라고 한다.
연결된 예외(chained exception) 란?
한 예외가 다른 예외를 발생시킬 수도 있다.
A가 B의 예외를 발생시킨다면, A를 B의 ‘원인 예외(cause exception)’라고 한다.
예제로 한번 보자!
💎예외💎
아래 코드는 SpaceException을 원인 예외로 하는 InstallException을 발생시키는 방법이다.
Try {
startInstall(); // SpaceException 발생
copyFiles();
} catch (SpaceException e) {
InstallException ie = new InstallException(“설치 중 예외 발생”); // 예외 발생
ie.initCause(e); // InstallException 원인 예외를 SpaceException으로 지정
throw ie; // InstallException을 발생시킨다.
}
먼저 InstallExceptiondmf 을 생성한 후에, initCause()로 SpaceException을 InstallExceptiondmf 의 원인 예외로 등록한다.
그리고 'throw'로 이 예외를 던진다.
✅ 참고
initCause()는 Exception클래스의 조상인 Throwable클래스에 정의되어 있기 때문에 모든 예외에서 사용 가능하다.
Throwable initCause(Throwable cause) : 지정한 예외를 원인 예외로 등록
Throwable getCause() :원인 예외를 반환
🙄여기서 궁금한 부분은 발생한 예외를 그냥 처리하면 될 텐데 왜 등록까지 해야 하는 걸까?
→ 이 이유는 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해서이다.
또 다른 이유는 checked 예외를 unchecked 예외로 바꾸기 위해서이다.
checked 예외가 발생해도 예외를 처리할 수 없는 상황에는 예외 처리가 강제되어 있기 때문에 의미 없는 try catch 문을 사용해야 하는 경우가 많다.
이런 경우 unchecked 예외로 바꾸면 예외처리가 선택적이 되므로 억지로 예외처리를 할 필요가 없다.
상속을 해서 사용하면 되지 않나❔❓
→ 굳이 상속을 만드는 번거로움과 구조적으로 엉킬 가능성,
또한 조상 관계로 설정했을 시에 어떤 자식 예외가 발생했는지 알기 어렵다.
*참고서적
Java의 정석
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] Random 클래스 (0) | 2022.12.13 |
---|---|
[JAVA] Objects 클래스 (0) | 2022.12.13 |
[JAVA] 사용자정의 예외 만들기 (0) | 2022.11.22 |
[JAVA] 자동 자원 반환 try-with-resources (0) | 2022.11.22 |
[JAVA] finally 블럭 (0) | 2022.11.22 |