충분히 쌓여가는
연결된 예외(chained exception) 본문
연결된 예외(chained exception)
한 예외가 다른 예외를 발생시킬 수 있다
예외 A가 예외 B를 발생시키면 A는 B의 원인예외(cause exception)이다
Throwable 링크 : Exception과 Error의 조상
Throwable initCause(Throwable cause) | 지정한 예외를 원인 예외로 등록 |
Throwable getCause() | 원인 예외를 반환 |
하나의 예외 안에 또다른 예외를 포함시킨다
public class Throwable implements Serializable {
...
private Throwable cause = this; // 객체 자신(this)를 원인 예외로 등록
...
public synchronized Throwable initCause(Throwable cause) {
...
this.cause = cause; // cause를 원인 예외로 등록
return this;
}
...
}
void install() throws InstallException {
try {
startInstall(); // SpaceException 발생
copyFiles();
} catch (SpaceException e) {
InstallException ie = new InstallException("설치 중 예외발생"); // 예외 생성
ie.initCause(e); // InstallException의 원인 예외를 SpaceException으로 지정
throw ie; // InstallException을 발생시킨다
} catch (MemoryException me) {
...
연결된 예외를 사용하는 이유
1. 여러 예외를 하나로 묶어서 다루기 위해서
void install() throws InstallException {
try {
strarInstall(); // SpaceException 발생
copyFiles();
} catch (SpaceException e) [
InstallException ie = new InstallException("설치 중 예외 발생"); // 예외 생성
ie. initCuase(e); // InstallException의 원인 예외를 SpaceException으로 지정
throw ie; // InstallException을 발생시킨다
} catch (MemoryException me) {
...
왼쪽: SpaceException 공간이 부족하다는 정보만 나옴
오른쪽: 실제 발생한 예외는 SpaceException, 발생한 예외는 InstallException
설치 중에 예외가 발생했다는 대략정인 정보를 주고, 세부정보로 공간이 부족하다는 정보를 준다
2. checked 예외를 unchecked 예외로 변경하려 할 때(필수처리를 선택처리로 바꿀 때 사용)
static void startInstall() throws SpaceException, MemoryException {
if(!enoughSpace()) // 충분한 설치공간이 없으면
throw new SpaceException("설치할 공간 부족");
if(!enoughMemory()) // 충분한 메모리가 없으면
throw new MemoryException("메모리 부족");
}
이미 SpaceException이 RuntimeException이 아닌 Exception로 많이 사용되고 있는 경우
RuntimeException으로 바꾸기 어렵다
class SpaceException extends Exception {
SpaceException(String msg) {
super(msg);
}
}
이때 RuntimeException을 하나 만들고 그 안에 SpaceException을 포함시킨다
(MemoryException 제거, RuntimeException 만들고 원인 예외[MemoryException]로 등록)
static void startInstall() throws SpaceException {
if(!enoughSpace()) // 충분한 설치공간이 없으면
throw new SpaceException("설치할 공간 부족");
if(!enoughMemory()) // 충분한 메모리가 없으면
throw new RuntimeException(new MemoryException("메모리 부족"));
}
연결된 예외 정리
어떤 예외를 다른 예외로 감싸는 것
세부적인 예외를 포괄적인 예외로 감쌀 때 사용
checked 예외를 unchecked 예외로 변경(필수처리를 선택처리로 바꿀 때 사용)
'Java > JAVA2' 카테고리의 다른 글
toString(), toString()의 오버라이딩 (0) | 2023.06.25 |
---|---|
hashCode() (0) | 2023.06.25 |
사용자 정의 예외 만들기, 예외 되던지기 (0) | 2023.06.24 |
checked 예외, unchecked 예외 (0) | 2023.06.22 |
예외 발생시키기 (0) | 2023.06.22 |