프로그래밍/JAVA

[JAVA] 예외 던지기(exception re-throwing) / 연결된 예외(chained exception)

리신 2022. 11. 22. 21:58
반응형

예외 던지기(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