본문 바로가기

JAVA

[JAVA] checked exception & unchecked exception

checked Exception & unchecked Exception

checked Exception

컴파일러 수준에서 인지할 수 있는 예외

try{}catch(){} 의 사용을 강제

 

unchecked Exception

runtimeException을 상속한 모든 Exception

Runtime(실행시)에 인지 할 수 있는 예외

try{}catch(){}문이 선택적

예외 처리의 유의 사항

이펙티브 자바에서 제시하는 예외처리의 유의점은 다음과 같다(항목 57 ~ 65)

항목. 57 - 예외 상황에서만 예외를 사용하자

다음과 같은 코드는 작성하면 안된다

try {
    int i = 0;
    while(true)
       range[i++].climb();
} catch(ArrayIndexOutOfBoundsException e) {       
}

항목. 58 - 복구 가능 상황에는 checked 예외를 사용하고 런타임 예외는 프로그램 예외에 사용하자

즉 해당 메소드를 호출한 곳에서 try ~ catch문을 이용하여 예외를 복구 할 수 있는 상황에만 사용되는 예외만을 checked 예외를 사용한다.

항목. 59 - checked 예외의 불필요한 사용을 피하자

항목. 60 - 표준 예외를 사용하자

항목. 61 - 하위 계층의 예외 처리를 신중하게 하자

무작정 상위계층으로 에러를 던지지 말자, 상위 계층으로 예외를 던질때는 상위계층이 알아 볼 수 있는 예외로 변환하여 던져야 한다.

항목. 62 - 메소드가 던지는 모든 예외를 문서하 하자

항목. 63 - 실패 상황 정보를 상세 메시지에 포함하자

항목. 64 - 실패 원자성을 갖도록 노력하자

호출된 메소드가 실행에 실패하더라도 객체 상태는 메소드 호출 전과 같아야 한다.

항목. 65 - 예외를 묵살하지 말자

다음과 같은 예외처리가 예외 묵살의 좋은 예이다.

try {
    ....
} catch(someException e) {}
 try {
    ....
} catch(someException e) {
    e.printStatckTrace();
}

Checked Exceptoin의 문제점

코드가 너무 많이 생긴다

깨지기 쉬운 메소드 원형

끝없는 예외 wrapping

checked exceptoin이 인터페이스에서 잘 동작하지 않는다

http://bleujin.tistory.com/30

 

checked Exception은 OCP(개방 폐쇄 원칙)을 위반한다

http://cleancodes.tistory.com/5

어떤 때 예외 처리를 해야 하는가?

이 글을 쓰게 된 취지는 이 의문에 대한 답을 찾아보기 위함이었다.

하지만 예외 처리 관련하여 자료를 찾고 공부를 할 수록 이에 대한 '명확한 답은 없다' 는 점만 더 확실해 졌다.

 

결론적으로, 예외처리는 개발자가 알아서 판단하여야 한다.

 

그래도 개인적으로 다음과 같은 가이드라인 정도는 제시할 수 있지 않을까 생각한다.

예외가 발생하는 상황이라면 예외가 발생하여야 한다.

예외가 발생한다는건 코드의 문제이건, 외부 요인의 문제이건 어떠한 문제가 존재한다는 이야기 이다.

그렇다면 예외 발생하였음을 인지해야 문제를 고치고 넘어가지, 예외가 발생했는데도 마치 프로그램이 멀쩡히 돌아가는 것 처럼 보여선 안된다. (대표적으로 항목 65 - 예외 묵살하기)

여러 예외가 발생하였는데도 모르고 그냥 지나가 버리면 오히려 더 큰 문제를 발생시키기위한 요인이 되어 버린다.

 

외부 요인으로 인한 예외가 발생하는 경우

예를 들어 외부 서버와의 통신을 하는 sdk 제공받아 개발을 진행중이라고 가정하자.

사용하는 메소드 중

coupang.getCoupangUserList(args1, args2);

같은 것이 있고, 위 메소드가 외부 서버와 통신을 하여 데이터를 가져온다면, 인터넷 환경등의 문제로 연결이 끊기는 등의 문제가 발생할때를 대비하여 

몇초이상 응답이 없을 경우 TimeOutException 등을 던지도록 개발되었을 것이다.

이런 경우는 필히 사용자가 상황을 인지해야하고, 또한 예외로 인한 프로그램다운등을 막기 위하여 

try ~ catch 등을 이용하여 예외처리를 해 주어야 할 것이다.

 

비지니스 로직 상에서 발생하여 사용자에게 인지시킬 필요가 있는 경우

간단한 예로 회원가입 등의 경우 필수 파라미터가 있다.

이런것들이 어떠한 이유로 누락되거나, 엉뚱한 값이 넘어오거나 했을 때 예외를 발생시키고 이를 사용자가 인지할 수 있도록 예외처리를 할 수 있다.

 

그외 개발자 판단하에 필요하다 싶은 부분에 예외 처리 로직을 작성한다.

참고자료

http://www.nextree.co.kr/p3239/

http://blog.benelog.net/1901121

http://homo-ware.tistory.com/161

http://b4you.net/blog/tag/Unchecked%20Exception

http://slipp.net/questions/259

http://kwonnam.pe.kr/wiki/java/exception?s[]=checked&s[]=exception