예외가 발생하고 catch 블록으로 잡는 것까지는 좋으나 무시하는 것은 정말 위험한 일이다. 프로그램에 예외가 발생했는데 무시하고 넘어가는 일이기 때문이다.
try {
if (pstmt != null) {
pstmt.close();
}
} catch (SQLException ignored) {
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException ignored) {
}
}
모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다.
**Exception
과 체크 예외**
java.lang.Exception
클래스와 그 서브 클래스로 정의되는 예외catch
문으로 잡든지, throws
를 정의해서 메서드 밖으로 던져야 한다.IOException
, SQLException
)**RunTimeException
과 언체크/런타임 예외**
java.lang.RuntimeException
클래스를 상속한 예외catch
, throws
등으로 처리를 명시적으로 해줘도 되고 안 해도 된다.IllegalArgumentException
등이 있는데 이론 예외는 주의 깊게 코드를 작성하면 피할 수 있다.체크 예외의 불필요성을 주장하는 사람들이 늘어갔는데 이는 예외 처리의 강제 때문에 catch, throws를 남발하는 코드가 생기기 때문이기도 하다.
최근에 새로 등장하는 자바 표준 API에는 언체크 예외만 쓰는 경향이 있다.
체크 예외는 catch
나 trhows
를 강제하기 때문에 개발자의 실수를 방지하기 위한 배려라고 볼 수도 있지만 실제로는 예외를 제대로 다루고 싶지 않을 만큼 짜증나게 만드는 원인이 되기도 한다.
자바가 처음 만들어질 때 많이 사용되던 독립형 애를리케이션에서는 통제 불가한 예외라도 애플리케이션 작업을 중단시키지 않고 상황을 복구해야 했다. 하지만 자바 엔터프라이즈 서버 환경은 다르다. 하나의 요청 중에 예외가 발생하면 해당 작업만 중단시키면 그만이다. (각 요청이 독립적인 작업이기 때문)
자바의 환경이 서버로 이동하면서 체크 예외의 활용도와 가치는 점점 떨어지기 때문에 대응 불가한 체크 예외는 빨리 런타임 예외로 전환해서 던지는 게 낫다.
애플리케이션 자체의 로직에 의해 의도적으로 발생시키고, 무엇인가 조치를 취하도록 요구하는 예외도 있는데 이를 애플리케이션 예외라고 한다.
SQLException
은 복구 가능한 예외인가? 99% 확률로 복구 방버비 없다.
스프링 JdbcTemplate
은 예외 전환 기법을 사용하여 DataAccessException
을 던지도록 하고 있다.