본문 바로가기
Dev/Java

에러(error)와 예외(Exception)의 차이

by 펭귄안에 온천 2022. 11. 12.
728x90
반응형

JDBC API를 사용하면 IDE가 빨간줄을 그어주며 '처리되지 않은 예외가 있다' 라고 에러 표시를 해준다.

이를 보고 우리는 try/catch으로 블록을 둘러싸주는 것으로 해결한다.

 

그러나 try/catch 코드를 보면 가끔 이런 코드를 발견한다.

try{
 //........예외 발생
}catch(SQLException e){
 //아무것도 안함
}

예외가 발생하면 catch로 예외를 잡아내는것은 좋은데 아무 대처도 하지 않고 넘어가 버리는 것은 정말 위험하다.

 

그렇다고 단순히

System.out.println(e), e.printStackTrace();등 로그만 찍히게 하는것도 위험하다.

이런 로그는 다른 로그에묻혀버리면 놓칠 수 있고 누군가는 콘솔로그를 계속 모니터링 해야한다.

 

public void method1() throws Exception{
	method2();
}
public void method2() throws Exception{
	method3();
    .......
}

또한 이런식으로 무의미하고 무책임하게 throws 선언하기도 한다.

 

매번 try/catch를 하기도 귀찮고, 필요도 없으니 throws Exception이라는 모든 예외를 무조건 던저버리는 것이다.

그러나 이러한 메소드 선언에서는 의미 있는 정보를 얻을 수 없다.

정말로 예외적인 상황이 발생한 것인지, 습관적 throws Exception을 복붙한 것인지 알수 없고

결과적으로 적절한 처리를 통해 복구될 수 있는 예외사항도 제대로 다룰 수 없게 된다.

핵심원칙

예외처리할때 반드시 지켜야할 핵심 원칙은

예외를 적절하게 복구하든지 아니면 작업을 중단시키고 운영자에게 분명하게 통보돼야 한다는 것이다.


예외의 종류

  • 에러(Error)
  • 예외(Exceptino)
    • 체크 예외 (Check Exception)
    • 언체크 예외 (Uncheck Exception)

 

에러

java.lang.Error 클래스의 서브 클래스들이다. 

OutOfMemoryError, ThreadDeath같이 시스템의 비정상적인 상황이 발생했을 경우에 사용된다.

주로 JVM에서 발생시키기 때문에 어플리케이션 코드에서 try/catch로 잡으려고 해도 대응 방법이 없기 때문에 

시스템 레벨에서 특별한 작업을 하는게 아니라면 이러한 에러 처리는 하지 않아도 된다.

 

예외

java.lang.Exception 클래스와 그 서브 클래스로 정의되는 예외들은 에러와 달리 개발자들이 만든 어플리케이션 코드의 작업 중에

예외 상황이 발생했을 경우에 사용 된다.

 

체크예외

RuntimeException클래스를 상속받지 않은 예외 클래스이며 복구 가능성이 있는 예외이므로

catch문으로 잡든지, throws로  정의해서 메소드 밖으로 던지는 예외처리 코드를 함께 작성해야 한다.

그렇지 않으면 컴파일 에러가 발생한다.

catch,throws등의 예외처리를 해주지 않아 컴파일 에러가 발생한다.

 

 

언체크예외

RuntimeException클래스를 상속한 클래스들을 말한다.

RuntimeException은 Exception의 서브 클래스이므로 Exception의 일종이긴 하지만 

자바는 RuntimeException와 그 서브 클래스를 특별하게 다루기 때문에 체크예외, 언체크 예외로 구분한 것이다.

 

RuntimeException클래스를 상속한 예외들은 명시적인 예외처리를 강제로 하지 않기 때문에 언체크 예외라고 한다.

catch,throws등으로 예외처리를 해주어도 상관 없지만 언체크 예외는 복구 가능성이 없어 예외처리를 강제하지 않는다.

 

런타임 예외는 예상하지 못했던 예외상황에서 발생하는 것이 아니기 때문에 굳이 catch,thorws를 사용하지 않아도 된다.

catch,throws 가 없어도 컴파일 가능하다


 

 

 

 

 

 

 

참고 - 토비의 스프링

 

반응형

'Dev > Java' 카테고리의 다른 글

Java reflection Sample Code  (0) 2022.12.16
예외 처리 방법  (0) 2022.11.12
JNDI, JDBC, DBCP  (0) 2022.10.03
Java 컴파일  (1) 2022.10.03
JDK vs JRE  (0) 2022.10.03