예외 전환 시 꼭 기존 예외 포함해야 함.
어떤 예외에서 파생되어 왔는 지 알아야 예외의 이유를 아니까.
예외 log.info() 할 때 e 넣으면 스택 트레이스 확인할 수 있음.
log.info("ex", e)
저 메시지랑 그 뒤에 스택 트레이스 찍히기 시작.
예외는 로그 찍을 때 {} 문자열에 이렇게 바인딩 할 곳 넣어주지 않아도 알아서 잘 나옴.
@Test
void printEx(){
Controller controller = new Controller();
try {
controller.request();
}catch(Exception e){
log.info("ex",e);
}
}
static class Repository {
public void call() {
try {
runSQL();
} catch (SQLException e) {
throw new RuntimeSQLException(e);
}
}
public void runSQL () throws SQLException {
throw new SQLException("sqlEx");
}
}
이거 찍어 보면,
이렇게 전 예외까지도 같이 나온다.
예외 생성자를 throwable 하면 그렇다.
맨아래 Caused by 짤렸는데, 저게 전 예외이다.
전 예외 여러개 넣으면 Caused By 여러 개 나와서 전 예외에 대한 정보가 나온다.
제일 밑에 있는, 원초적인 에러의 원인을 제공하는 것을 root cause 라고 함
예외 전환 시에는 꼭, 기존 예외를 포함하자.
커스텀 예외 만들더라도 생성자 cause 넣을 수 있게끔 Throwable 인자로 받는 생성자를 추가시켜 주자.
static class RuntimeSQLException extends RuntimeException {
public RuntimeSQLException() {
}
public RuntimeSQLException(Throwable cause) {
super(cause);
}
}