
자바 예외에 대해 학습하고 정리한 내용입니다.

예외도 객체이기에 Object가 최상위 부모입니다.
Throwable 최상위 예외이 클래스(또는 그 하위 클래스 중 하나)의 인스턴스인 객체만 Java 가상 머신에서 throw되거나 Java throw 문에서 throw될 수 있습니다.
마찬가지로, 이 클래스 또는 그 하위 클래스 중 하나만 catch 절의 인수 유형이 될 수 있습니다.
Error (시스템 오류)Error 메모리 부족, 심각한 시스템 오류
→ 애플리케이션에서 복구 불가능한 시스템 예외
⇒ 애플리케이션 개발자는 이 예외를 잡으려고 해서는 안됩니다.
catch로 잡으면 그 하위 예외까지 잡습니다.Exception 부터 필요한 예외로 생각하고 잡으면 됩니다.Exception을 catch로 잡으면 하위 예외들도 모두 잡을 수 있음Exception을 throw로 던지면 하위 예외들도 모두 던질 수 있음Exception: 체크 예외Exception의 하위에 존재하지만 RuntimeException은 예외로 언체크 예외입니다.RuntimeException: 언체크 예외 (런타임 예외라고도 부름)⭐ Checked Exception
반드시 처리해야 하고, 처리하지 않으면 컴파일 에러가 발생해서 컴파일되지 않음
⭐ Unchecked Exception
처리하지 않아도 컴파일 에러가 발생하지 않고, 실행이 가능
잡아서 처리하거나, 밖으로 던지도록 선언해야 함 그렇지 않으면 컴파일 오류 발생합니다.
체크 예외를 처리할 수 없을 때는 method() throws예외 를 사용해서 밖으로 던질 예외를 필수로 지정해 주어야 합니다.
throws에 상위 타입을 주어도 던질 수 있습니다.
개발자가 실수로 예외를 누락하지 않도록 컴파일러를 통해 문제를 잡아줍니다.
개발자가 모든 체크 예외를 반드시 잡거나 던지도록 처리해야 하기 때문에, 크게 신경쓰고 싶지 않은 예외까지 모두 챙겨야 합니다.
+) 의존관계에 따른 단점까지 존재합니다.
RuntimeException 과 그 하위 예외예외를 잡아서 처리하지 않아도 throw 를 생략할 수 있습니다.
신경쓰고 싶지 않은 예외를 무시할 수 있으며, 의존관계를 참조하지 않아도 됩니다.
개발자가 실수로 예외를 누락할 수 있습니다.
기본적으로 언체크(런타임) 예외를 사용하자
체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용하자
ex) 계좌 이체 실패, 결제시 포인트 부족, 로그인 ID or PW 불일치 등…
개발자가 실수로 예외를 놓치면 안된다고 판단되는 경우
throws를 통해 선언되어야 합니다.💡
throws Exception을 사용하면 해결이 가능
하지만, 다른 체크 예외를 체크할 수 있는 기능이 무효화되고,
중요한 예외가 발생해도 놓치게 됨
따라서 꼭 필요하지 않다면Exception을 밖으로 던지는 것은 좋지 않은 방법
체크 예외가 발생하면 런타임 예외로 전환해서 예외를 던지고,
런타임 예외는 놓칠 수 있기 때문에 문서화가 중요합니다.
throws 런타임예외를 남겨서 중요한 예외를 인지할 수 있게 하는 것도 방법입니다.catch(SQLException e) {
throw new runtimeSQLException(e);
}
SQLException일 경우 DB에서 발생한 예외를 확인할 수 없는 문제가 생기게 됩니다.@Slf4j
public class Exam {
public void exam() {
try{
// ...
} catch(Exception e) {
log.info("message={}", msg, e);
}
}
}
+) 로그를 출력할 때 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있습니다.
INFO ... message=데이터 저장 실패
java.lang.IllegalArgumentException: 잘못된 인자입니다.
at com.example.Exam.exam(Exam.java:42)
... (이하 생략된 스택트레이스)