원인 예외(cause exception)
한 예외가 다른 예외를 발생시킬 수 있다.
예를 들어 예외A가 예외B를 발생시켰다면, A를 B의 '원인 예외(cause exception)'라고 한다.
try {
startInstall();
copyFiles();
} catch (SpaceException e) {
InstallException ie = new InstallException("설치중 예외발생"); // 예외 생성
ie.initCause(e); // InstallException의 원인 예외를 SpaceException으로 지정
throw ie; // InstallException을 발생시킨다.
} catch (MemoryException me) {
...
}
Throwable initCause(Throwable cause)
지정한 예외를 원인 예외로 등록
Exception클래스의 조상인 Throwable클래스에 정의되어 있기 때문에 모든 예외에서 사용이 가능
Throwable getCause()
원인 예외를 반환
왜 연결하나?
발생한 예외를 그냥 처리하면 될 텐데, 원인 예외로 등록해서 다시 예외를 발생시키는지 궁금할 것이다.
1. 큰 분류의 예외로 묶어서 다루기 위함
2. 상속관계를 무시할 수 있음
try {
startInstall(); // SpaceException 발생
copyFiles();
} catch (InstallException e) { // InstallException은
e.printStackTrace(); // SpaceException과 MemoryExcpetion의 조상
}
위와 같이 InstallException을 SpaceException과 MemoryException의 조상으로 해서 catch 블럭을 작성하면, 실제로 발생한 예외가 어떤 것인지 알 수 없다는 문제가 있다.
SpaceException과 MemoryException의 상속관계를 변경해야 한다는 것도 부담이다.
만약 원인 예외를 포함하게 된다면 두 예외는 상속관계가 아니여도 상관없다.
3. checked 예외를 unchecked 예외로 바꿀 수있다.
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("메모리가 부족합니다."));
}
MemoryException은 Exception의 자손이므로 반드시 예외를 처리해야하는데, 이 예외를 RuntimeException으로 감쌋기 때문에 unchecked 예외가 되었다.
그래서 startInstall()의 선언부에 MemoryException을 선언하지 않아도 된다.
'Java' 카테고리의 다른 글
String Class (3) | 2021.09.30 |
---|---|
Object Class (0) | 2021.09.30 |
예외 되던지기(exception re-throwing) (0) | 2021.09.27 |
사용자 정의 예외(Exception) 만들기 (0) | 2021.09.27 |
try-catch문 (0) | 2021.09.27 |
원인 예외(cause exception)
한 예외가 다른 예외를 발생시킬 수 있다.
예를 들어 예외A가 예외B를 발생시켰다면, A를 B의 '원인 예외(cause exception)'라고 한다.
try {
startInstall();
copyFiles();
} catch (SpaceException e) {
InstallException ie = new InstallException("설치중 예외발생"); // 예외 생성
ie.initCause(e); // InstallException의 원인 예외를 SpaceException으로 지정
throw ie; // InstallException을 발생시킨다.
} catch (MemoryException me) {
...
}
Throwable initCause(Throwable cause)
지정한 예외를 원인 예외로 등록
Exception클래스의 조상인 Throwable클래스에 정의되어 있기 때문에 모든 예외에서 사용이 가능
Throwable getCause()
원인 예외를 반환
왜 연결하나?
발생한 예외를 그냥 처리하면 될 텐데, 원인 예외로 등록해서 다시 예외를 발생시키는지 궁금할 것이다.
1. 큰 분류의 예외로 묶어서 다루기 위함
2. 상속관계를 무시할 수 있음
try {
startInstall(); // SpaceException 발생
copyFiles();
} catch (InstallException e) { // InstallException은
e.printStackTrace(); // SpaceException과 MemoryExcpetion의 조상
}
위와 같이 InstallException을 SpaceException과 MemoryException의 조상으로 해서 catch 블럭을 작성하면, 실제로 발생한 예외가 어떤 것인지 알 수 없다는 문제가 있다.
SpaceException과 MemoryException의 상속관계를 변경해야 한다는 것도 부담이다.
만약 원인 예외를 포함하게 된다면 두 예외는 상속관계가 아니여도 상관없다.
3. checked 예외를 unchecked 예외로 바꿀 수있다.
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("메모리가 부족합니다."));
}
MemoryException은 Exception의 자손이므로 반드시 예외를 처리해야하는데, 이 예외를 RuntimeException으로 감쌋기 때문에 unchecked 예외가 되었다.
그래서 startInstall()의 선언부에 MemoryException을 선언하지 않아도 된다.
'Java' 카테고리의 다른 글
String Class (3) | 2021.09.30 |
---|---|
Object Class (0) | 2021.09.30 |
예외 되던지기(exception re-throwing) (0) | 2021.09.27 |
사용자 정의 예외(Exception) 만들기 (0) | 2021.09.27 |
try-catch문 (0) | 2021.09.27 |