[Java Basic] ch7.연결된 예외
연결된 예외
한 예외가 다른 예외를 발생 시킬 수 있다.
이때 예외 a가 예외 b를 발생 시켰다면 a를 b의 원인예외
라고 합니다.
아래 코드에서 자식 예외인 AException과 CException, 부모 예외인 BException이 있습니다.
AException이 발생하고 a를 BException에 넣어서 b를 던집니다.
Exception in thread "main" basic.chained_exception.BException: AException occurred
at basic.chained_exception.ChainedException.main(ChainedException.java:9)
Caused by: basic.chained_exception.AException: AException occurred
at basic.chained_exception.ChainedException.aMethod(ChainedException.java:20)
at basic.chained_exception.ChainedException.main(ChainedException.java:6)
public class ChainedException {
public static void main(String[] args) throws BException {
try {
aMethod();
cMethod();
} catch (AException a) {
BException b = new BException("AException occurred");
b.initCause(a);
throw b;
} catch (CException c) {
BException b = new BException("CException occurred");
b.initCause(c);
throw b;
}
}
public static void aMethod() throws AException {
throw new AException("AException occurred");
}
public static void cMethod() throws CException {
throw new CException("CException occurred");
}
}
// A
public class AException extends BException{
public AException(String message) {
super(message);
}
}
// B
public class BException extends Throwable{
public BException(String message) {
super(message);
}
}
// C
public class CException extends BException{
public CException(String message) {
super(message);
}
}
🤔 왜?
왜 이렇게 귀찮게 부모 예외를 가지고와서 initCause
를 통해서 다시 throw 하는걸까요?
아래와 같이 예외를 던지는 것보다 위와 같이 예외를 던져야 하는 이유가 뭘까요?
public class NotChainedException {
public static void main(String[] args) throws BException {
try {
aMethod();
cMethod();
} catch (BException b) {
b.printStackTrace();
}
}
public static void aMethod() throws AException {
throw new AException("AException occurred");
}
public static void cMethod() throws CException {
throw new CException("CException occurred");
}
}
💡 제 생각은 한층 추상화 된 예외를 던져야 하는 상황이 있어 위와 같이 사용한다고 생각합니다. 예를 들어 insert중에 무결성 제약조건 관련되어 에러가 발생했고, 이를 Servcie 계층까지 전달 해야한다면, 무결성 제약조건을 그대로 던지는 것이 아니고 어떤 과정에서 에러가 났는지 한층 추상화 된 예외를 던져줘야 한다고 생각합니다.
왜냐면 Service 계층에선 무결성 제약조건인지 정확하게 핸들링할 필요가 없고 어떤 과정에서 에러가 발생했는지만 알면 되기 때문입니다.
댓글남기기