3. 개요
어떤 애플리케이션이든 오류가 발생하고, 오류를 완벽하게 예방하기는 불가능
개발자가 가장 신경 쓰기 귀찮아 하는것이 예외 처리
예외를 잘 사용한다면 프로그램의 가독성과 신뢰도 및 유지 보수성을 향상 시킬
수 있다.
대신 잘못사용한다면 이와는 반대의 효과를 낼 수 있다.
예외를 잡았으면 처리하고 처리했으면 기록을 남겨라
4. 예외? 예외!
프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는
경우 이러한 결과를 초래하는 원인을 에러 또는 오류라고한다.
자바에서는 실행(Runtime) 시 발생할 수 있는 오류를 에러와 예외, 두가지로 구
분
에러(Error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
5. 예외?예외!
자바에서는 실행 시 발생할 수 있는 오류(Exception과 Error)를 클래스로 정의
[오류 클래스 계층도]
7. 예외...난감하네...
흔히 많이 보이는 예외를 잡았으나 잡지 않은것 같은 이야기
try {
...blar blar…
} catch(Exception e) {
}
try {
...blar blar…
} catch(Exception e) {
System.out.println(e);
}
try {
...blar blar…
} catch(Exception e) {
e.printStackTrace();
}
8. 예외...난감하네...
귀찮아서 무의미하게 메서드 선언시 throws Exception을 붙이는 경우
적절한 처리를 통해 복구될 수 있는 상황도 제대로 처리할 수 있는 기회를 박탈 당하
게된다.
public void method1() throws Exception {
method2();
}
public void method2() throws Exception {
method3();
}
public void method2() throws Exception {
method3();
}
9. 예외 처리의 시작
일반적인 예외 처리 방법
자바에서 예외 처리를 위한 몇가지(?) 가이드
스프링 프레임워크에서 사용되는 예외처리 방법
10. 일반적 예외 처리 1 - 예외 복구
예외상황을 파악하고 문제를 해결해서 정상
상태로 돌려놓는 것
예외 처리 코드를 강제하는 체크 예외들은 이
렇게 예외를 어떤식으로든 복구할 가능성
이 있는 경우에 사용
int maxretry = MAX_RETRY;
while(maxretry -- > 0) {
try {
// 예외가 발생할 가능성이 있는 시도
return; // 작업성공시 리턴
}
catch (SomeException e) {
// 로그 출력. 정해진 시간만큼 대기
}
finally {
// 리소스 반납 및 정리 작업
}
}
throw new RetryFailedException(); // 최대 재시도 횟
수를 넘기면 직접 예외 발생
11. 일반적 예외 처리2 - 예외처리 회피
예외처리를 자신이 담당하지 않고 자신을 호
출한 쪽으로 던져버리는 것
예외를 자신이 처리하지 않고 회피하는 방법
예외처리를 회피하려면 반드시 다른 오브젝트
나 메서드가 예외를 대신 처리할 수 있도록
던져줘야 한다.
public void add() throws SQLException {
... // 구현 로직
}
12. 일반적 예외처리3 - 예외전환
예외를 메서드 밖으로 던지는것
예외회피와는 달리 적절한 예외로 전환해서
던지는 특징
의미가 불분명한 예외의 의미를 분명하게 해
줄 수 있는 예외로 전환하기 위해
예외를 처리하기 쉽고 단순하게 만들기 위해
포장하는 것
try {
...blar blar…
} catch(Exception e) {
throw DuplicateUserIdException(e);
}
13. 자바에서 예외 처리 시 가이드
기본적으로 자바에서 사용할 수 있는 예외처리 내용을 몇가지 단계로 나눠서 설
명
14. 1)예외를 잡았으면 처리하자
예외를 잡아서 그냥 콘솔로
출력하면 되는 경우는 거
의 없다.
컴파일 된다고 코딩이 끝난
것이 아니다.
어떻게 처리할지 모른다면
잡지 말자
처리하고 예외상황 종료
로그를 남겨야한다.
다시 던진다.
로그를 위해 메세지를 보고
다시 던진다.
다시 던질때는 메세지를 바꾸
지 않는다.
새 예외로 던진다.
무시한다.
내가 무엇을 더 해볼 수 없을
경우
Anticode
try {
blar…
} catch(Exception e) {
e.printStackTrace();
}
15. 2) 예외를 처리했으면 로그를 남겨라
로그도 없고 처리도 안한것
은 최악이다. 차라리 안잡
는것이 낳다
뭔가 잘못됐다고 리포팅은
되지만 재현할 방법이 없
다
처리는 했는데 로그가 없는
것은 아주 나쁘다.
예외가 발생한 상황을 알수
가 없다. 시스템 개선이
힘들다.
처리도하고 로그도 있을 때
있으나 마나한 로그들은 정
말 있으나 마나한것이다.
로그는 충분한 상황을 알려
주어야하고 자세히 알려
주는것이 좋다.
Anticode
} catch(Exception e) {
// do nothing - 있으나마나
}
16. 3) 기존 예외의 정보 누락 금지
절대 잡은 예외의 정보를 누락하지 말자.
반드시 cause로 설정하자
자세하고 친절한 설명까지는 아니더라도 최소
한 잡은 예외의 정보를 누락하지는 말자
Anticode
} catch(Exception e) {
throw new OtherException(“blar”);
}
17. 4) 예외를 던질 때의 가이드
메세지 충실히
잡을 곳을 기준으로 예외 객체 선택
메세지를 파싱하게 하지 말자
추상 예외로 던지지 말자
18. 그외 가이드
더 많은 예외 처리에 대한 얘기를 하고 싶으나 마지막에 시간이 남으면 얘기를 진행
해 보겟음
19. 스프링에서 예외 처리
교재로 사용중인 토비의 스프링에서 예외 처리 부분은 DB 처리 부분으로 되어 있
어서 그냥 일반적인 컨트롤러나 서비스 단에서 처리가 어떻게 되는지 설명해
보겠음
20. 컨트롤러 기반의 예외처리
ExceptionHandler 사용하
기
@ResponseStatus 어노테
이션 없이 예외를 처리
한다.
사용자를 특정 에러페이지
로 리다이렉트한다.
커스텀 에러 응답을 만든다.
@Controller
public class ExceptionHandlingController {
// @RequestHandler methods
...
// Exception handling methods
// Convert a predefined exception to an HTTP Status code
@ResponseStatus(value=HttpStatus.CONFLICT,
reason="Data integrity violation") // 409
@ExceptionHandler(DataIntegrityViolationException.class)
public void conflict() {
// Nothing to do
}
// Specify name of a specific view that will be used to display the error:
@ExceptionHandler({SQLException.class,DataAccessException.class})
public String databaseError() {
// Nothing to do. Returns the logical view name of an error page, passed
// to the view-resolver(s) in usual way.
// Note that the exception is NOT available to this view (it is not added
// to the model) but see "Extending ExceptionHandlerExceptionResolver"
21. 예외와 뷰
예외를 뷰에서 보여줄때
사용자들은 예외 메세
지나 stacktrace가 들
어가 페이지를 보고
싶어하진 않는다.
페이지 소스 안에 보이지
않는것처럼 예외사항
을 넣어놓을 수 있다.
<h1>Error Page</h1>
<p>Application has encountered an error. Please contact support on ...</p>
<!-- Failed URL: ${url} Exception: ${exception.message} <c:forEach
items="${exception.stackTrace}" var="ste"> ${ste} </c:forEach> -->
22. 예외 처리의 끝
예외 처리는 정말 내용이 너무 많아서 다 쓰자니 끝나지 않을것 같아서 이정도에
서 마무리
예외가 잡히는 상황별로 잡아서 처리만 제대로 한다면 더 나은 시스템으로 개선
이 가능할것 같다.
23. 마치며
준비를 하며 여기에 다 표현하지 못한 내용이 많이 있습니다.
제가 게을러서 그런것이겠지요..ㅠㅠ
무엇을 표현을 못했는지 궁굼하시면 물어봐 주세요.ㅎㅎ