🌱 오늘의 주제 : 예외 되던지기, 연결된 예외
🌱 예외 되던지기 (exception re-throwing)
- 한 메서드에서 발생할 예외가 여럿인 경우, 몇 개는 매서드 안에서 try - catch 문을 통해서 처리하고, 나머지는 선언부에 지정하여 호출한 메서드에서 처리하도록 함으로써, 양쪽에서 나눠서 처리하도록 하는 것.
- 예외를 처리한 후에 인위적으로 다시 발생시키는 방법을 통해서 가능하다. 이것을 예외 되던지기 (exception re - throwing)라고 한다.
- 하나의 예외가 발생한 메서드와 이를 호출한 메서드 양쪽 모두에서 처리해줘야 할 작업이 있을 때 사용.
- 주의할 점: 예외가 발생한 메서드에서 try-catch문으로 예외처리를 해줌과 동시에, 메서드의 선언부에 발생할 예외를 throws에 지정해줘야 한다.
package try_catch;
public class ex8_12 {
public static void main(String[] args) {
// 예외 되던지기 (exception re-throwing)
try {
method1();
} catch (Exception e) { // 다시 예외 처리.
System.out.println("main메서드에서 예외가 처리되었습니다.");
}
}
static void method1() throws Exception { // 예외 선언
try {
throw new Exception(); // 예외 발생.
} catch (Exception e) {
System.out.println("method1메서드에서 예외가 처리되었습니다.");
throw e; // 다시 예외를 발생시킨다.
}
}
}
----
method1메서드에서 예외가 처리되었습니다.
main메서드에서 예외가 처리되었습니다.
🌱 연결된 예외(chained exception)
- 예외 A가 예외 B를 발생시켰다면, A를 B의 원인 예외(casue exception)라고 한다.
Trowable initCause (Throwable cause) 지정한 예외를 원인 예외로 등록
Throwable getCause() 원인 예외를 반환
- 원인 예외로 등록하는 이유
- 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함. - 예를 들어, 상속관계일 경우, 실제로 어떤 발생한 예외가 어떤 것이 알 수 없는 문제를 해결해줌.
- checked 예외를 unchecked 예외로 바꿀 수 있도록 하기 위함. - 예외처리가 선택적으로 되므로 억지로 예외처리를 하지 않아도 된다.
package try_catch;
public class ex8_13 {
public static void main(String[] args) {
// 연결된 예외(chained exception)
try {
install();
} catch(InstallException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} // main
static void install() throws InstallException {
try {
startInstall(); // 프로그램 설치에 필요한 준비를 한다.
copyFiles(); // 파일들을 복사한다.
} catch (SpaceException2 e) {
InstallException ie = new InstallException("설치 중 예외 발생.");
ie. initCause(e); // 연결된 예외.
throw ie; // 예외 되던지기.
} catch (MemoryException2 me) {
InstallException ie = new InstallException ("설치 중 예외발생.");
ie.initCause(me); // 연결된 예외.
throw ie; // 예외 되던지기.
} finally {
deleteTempFiles(); // 프로그램 설치에 사용된 임시파일들을 삭제한다.
}
}
static void startInstall() throws SpaceException2, MemoryException2 {
if (!enoughSapce() ) {
throw new SpaceException2("설치할 공간이 부족합니다.");
}
if (!enoughMemory()) {
throw new MemoryException2("메모리가 부족합니다.");
// throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
}
} // startInstall
static void copyFiles() {}
static void deleteTempFiles() {}
static boolean enoughSapce() {
return false;
}
static boolean enoughMemory() {
return true;
}
} // ExceptionTest
class InstallException extends Exception {
InstallException(String msg) {
super(msg);
}
}
class SpaceException2 extends Exception {
SpaceException2(String msg) {
super(msg);
}
}
class MemoryException2 extends Exception {
MemoryException2(String msg) {
super(msg);
}
}
----------
try_catch.InstallException: 설치 중 예외 발생.
at try_catch.ex8_13.install(ex8_13.java:22)
at try_catch.ex8_13.main(ex8_13.java:8)
Caused by: try_catch.SpaceException2: 설치할 공간이 부족합니다.
at try_catch.ex8_13.startInstall(ex8_13.java:36)
at try_catch.ex8_13.install(ex8_13.java:19)
... 1 more
'Java' 카테고리의 다른 글
Java - Object클래스 (0) | 2023.02.27 |
---|---|
Java - BufferedReader (0) | 2023.02.26 |
Java - 메서드에 예외 선언하기 (0) | 2023.02.21 |
Java - checked 예외, unchecked 예외 (0) | 2023.02.21 |
Java - try - catch문 (0) | 2023.02.20 |