본문 바로가기

자바 (Java)/요약

Chpt 8. 예외 - 주제 3. 연결된 예외

728x90

예외 A가 예외 B를 발생시켰다면 예외 A는 예외 B의 원인 예외다.

 

1. 예외 연결 방법

 

예외를 연결하는 방법에는 두 가지가 있다.

 

1) Throwable 클래스의 initCause 메서드 사용

 

다음 상속 계층도를 참고하면 모든 Exception의 최고 조상은 Throwable이기 때문에 Throwable 클래스의 initCause 메서드 사용하면 예외를 연결할 수 있다.

 

[예 1]

 

try {
	startInstall();
    copyFiles();
} catch (SpaceException se)
	InstallException ie = new InstallException("설치 중 예외 발생");
    ie.initCause(se);
    throw ie;
} catch (MemoryException me {
...

 

6번째 줄을 보면 SpaceException이 원인 예외 그 결과로 InstallException 예외를 발생한다. 

 

2) 원인 예외로 감싸기

 

static void startInstall() throws SpaceException, MemoryException {
	if(!enoughSpace())
    	throw new SpaceException("설치할 공간이 부족합니다.");
        
	if(!enoughMemory())
    	throw new MemoryException("메모리가 부족합니다.");
}

 

static void startInstall() throws SpaceException {
	if(!enoughSpace())
    	throw new SpaceException("설치할 공간이 부족합니다.");
        
	if(!enoughMemory())
    	throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
}

 

두 코드 블럭의 차이점을 보면 RuntimeException이 원인 예외, MemoryException이 결과가 된다.

 

2. 예외 연결의 이유

 

(1) 여러 예외들을 하나의 큰 예외로 묶어서 다루기 위함
(2) checked 예외를 unchecked 예외로 바꾸기 위함

 

(1)을 물론 여러 예외 클래스들을 하나의 조상 예외 클래스로 묶어 다룰 수도 있겠지만 예외가 발생했을 때 어떤 자손 클래스에서 예외가 발생했는지 알기에 어렵고, 상속 관계를 변경해야 하는 점 또한 번거롭다. 위 코드 블럭은 (2)를 반영하는 예이다. 

반응형