오늘 사용할 파일 : ExceptionDesc, DataAccessException
🚩보강에서 할일
1. Exeption의 기본
2. Exeption 예외 처리
3. 분야에 특화된 Custom Exeption 사용해보기
4. web application에서 어떻게 처리하고 있는지
그냥필기...
art + shift + j : 주석
Throwable
문서를 보자
① The Throwable class is the superclass of all errors and exceptions in the Java language.
>>point : error와 exception은 다르다.
② Only objects that are instances of this class (or one of its subclasses) are thrown by the Java Virtual Machine or can be thrown by the Java throw statement.
>>point : jvm에서 또는 throw를 통해서 예외를 던질 수 있다.
③ Similarly, only this class or one of its subclasses can be the argument type in a catch clause.
>>point : catch에서 예외를 잡을 수 있다.
**error와 exception은 개발자가 예외를 처리 할 수 있냐없냐의 차이이다.
예외 ▶프로그램의 정상 실행이 중단될 수 있는 모든 조건과 상황에 대한 통칭이다.
==> java.lang.Throwable 타입으로 캡슐화 되어있다.
Throwable은 두가지 하위 타입이 있다.
▶ java.lang.Error : 시스템 실패 상황으로 일반적으로 개발자가 처리할 수 없는 에러.
▶ java.lang.Exception : 예외 처리 정책에 따라 조건문의 형태로 처리가 가능한 예외.
Exception(예외)는 또다시 두가지 하위 타입으로 나뉜다.
▶checked exception(non RuntimeException)
: 회피/복구/전환 중 어느 한가지 예외 처리 정책을 기반으로 반드시 처리를 해야 하는 예외.
▶unChecked exception(RuntimeException 하위 타입)
: 개발자가 직접 처리하지 않더라도 자동으로 예외 회피(throws) 전략이 사용되는 예외.
이러한 예외를 처리하는 정책은
▷예회 회피(소극적 처리)
: throws 키워드를 이용해 메소드의 콜스택 데이터를 기반으로 호출자에게 예외 처리를 떠넘기는 전략.
▷예외 처리(적극적 처리)
: try(){}catch(){}finally{} 구문으로 직접 처리하는 전략. >> 예외 복구 / 예외 전환
▷Custom Exception
1. 예외의 특성에 따라 상위 타입을 결정(Exception vs RuntimeException)
2. throw 예외 객체 생성
public class ExceptionDesc {
public static void main(String[] args) throws InterruptedException {
try {
String data = method1();
System.out.println(data);
}catch(NullPointerException e) {
// System.err.println(e.getMessage());
e.printStackTrace();
try {
Thread.sleep(3000);
System.out.println("정상 처리 가장.");
} catch (InterruptedException e1) {
// throw e1;
throw new RuntimeException(e1);
}
}
}
private static String method1() {
if(1==1) {
// throw new NullPointerException("강제 발생 예외");
try{
throw new SQLException("강제 발생 예외");
}catch(SQLException e) {
throw new DataAccessException(e);
}
}
return "DATA";
}
}
회피 정책
==> 회피 정책을 쓰려면 checked exception에 대해서 알고 있어야한다.
먼저, Exception은 RuntimeException인 것과 아닌 것으로 나뉜다. RuntimeException은 unChecked Exception으로 자동으로 throws되어있어 개발자가 직접 처리하지 않아도 된다. 그러나 위의 코드에서처럼 checked exception은 반드시 처리해야하며 throws 처리를 해주지 않으면 예외 처리가 되지 않는다. 그래서 non RuntimeException이라고도 한다. 이렇게 예외를 던지면 호출한 메서드가 처리할 수 있고 그곳에서도 던져진다면 main메서드를 호출하고 있는 Java Virtual Machine에게 넘어간다. 이렇게 throws를 이용해서 예외처리를 던져버릴 수 있다.
==> 직접 예외 처리를 하고자 한다면 try, catch문을 사용할 수 있다.
try(Closable 객체 생성 및 선언){
예외 발생 가능 구문
}catch(처리 가능한 예외 선언, Throwable 하위 타입){
-> 예외 복구 -> 예외 로그 기록 -> 일정시간 지연 -> 예외 발생 작업에 대한 재실행
-> 예외 전환 : 명확한 조건이나 상황을 표현할 수 있는 예외의 형태로 변경(wrapping).
catch(IOException e){
throw new FileCopyFailureException(e);
}
Custom Exception
1. 예외의 특성에 따라 상위 타입을 결정(Exception vs RuntimeException)
2. throw 예외 객체 생성
}finally{
예외 발 생 여부와 상관없이 실행되는 구문.
}
예외 복구
배치잡을 예로 든다면,
배치잡을 준비했는데 트래픽이 몰려서 처리를 못했다. 그러면 그것을 복구하기 위해
1. 발생 상황을 log로 남긴다.
2. 일정 시간동안 시간지연으로 대기한다.
3. 그 시간동안 지연된 이후에 해당 작업을 retry해본다.
그것을 catch 작업에서 코드화한다. => 예외 복구 : 아무일도 없었던것처럼 돌리는 것, 그러나 기록은 필요
근본적으로 발생한 예외의 정보가 사라져서는 안된다.
예외 전환
예외를 다른 예외로 전환하는 것을 말하는데, 이때 기존의 근본적인 예외의 기록을 남기기 위해 wrapping을 꼭 해야한다.
ex) IOException e가 발생했는데 FileCopyFailureException()으로 전환할 경우, throw new FileCopyFailureException(e);처럼 기존의 exception의 정보가 들어있는 e를 wrapping하여 넣어둔다.
Custom Exception
말 그대로 사용되는 분야에 특화되게끔 커스텀 한 exception이다. 예외의 특성에 따라 상위 타입을 Exception으로 할지 RuntimeException으로 할지 결정하고 throws가 아닌 throw 예외 객체를 생성한다.
CallStack(호출 스택)
: 스택. LIFO(Last In First Out)
https://ui.toast.com/weekly-pick/ko_20170306
자바스크립트 에러와 스택 트레이스 심화
이번 시간에는 에러와 스택 트레이스를 조작하는 방법에 대해 이야기하려 한다. 때때로 사람들은 이런 세부 사항에 대해 신경쓰지 않지만, 테스트나 에러와 관련된 어떤 라이브러리를 작성하려
ui.toast.com
StrackTrace(스택 추적)
stackTrace를 이용하면 stack에 들어있는 예외를 발생시킨 곳을 호출하면서 쌓인 모든 주소들의 스택 구조를 볼 수 있다.
스택은 아래부터 차곡차곡 쌓이므로 맨 위에 나오는 자료가 가장 나중의 호출된 자료이다.
e.printStrackTrace();가 바로 이것이다.
다음 같은 큰 사이트에 가서 에러를 발생시켜보면 404코드가 그대로 나오는 것이 아니고 정돈되어 사용자가 잘 알아볼 수 있도록 정제되어 제공된다. 이런 사소한 것이 사용자를 한 번 더 배려하는 것이다. 그래서 우리가 만든 페이지에도 에러를 정제하여 보여주도록 해보았다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<jsp:include page="/includee/preScript.jsp"/>
</head>
<body>
<h1>BTS 멤버 못찾았어!</h1>
<h1><%=exception.getMessage() %></h1>
<jsp:include page="/includee/postScript.jsp"/>
</body>
</html>
위에 지시자(<%@ page ... %>) 스크립트 요소를 보면 isErrorPage="true" 가 있다.
isErrorPage가 true로 되면 예외처리를 하는 jsp라는 의미가 된다. 그래서 이곳에서 예외 화면을 '다음'같은 사이트처럼 예쁘게 정제하여 만들어놓을 수 있는 것이다. 그리고 이런 처리 예외가 발생했을 때 띄우기 위해서는 web.xml에서 아래 코드블럭에서 처럼 설정하여 관련된 예외를 띄워줄 수 있다.
<error-page>
<error-code>404</error-code>
<location>/errors/error404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/errors/error500.jsp</location>
</error-page>
<error-page>
<exception-type>kr.or.ddit.bts.BtsMemberNotFoundException</exception-type>
<location>/errors/errorBts.jsp</location>
</error-page>
<error-page> 에러 페이지를 설정하는 태그
<error-code> <location> 어떤 에러 코드에서 어디 location을 띄울 것이냐
<exception-type> <location> 커스텀한 에러 타입을 설정하고 그 위치를 잡아서 띄울 수도 있다.
'내가 보려고 정리하는 > Spring' 카테고리의 다른 글
웹 : jsp 기본객체( application ), js 함수지향언어, this!! :0316 (0) | 2023.03.16 |
---|---|
웹 : JSP 기본객체, buffer, scope 저장소 Session : 0315 (0) | 2023.03.15 |
웹 : SOLID원칙에 맞춰 5Layered Model2 방식 만들기 : 0314 (0) | 2023.03.14 |
웹 : (sw아키텍처/디자인패턴 루틴 시작__), include, page 모듈화, bootstrap : 0313 (2) | 2023.03.13 |
웹 : 300번 응답코드 : 0309 (0) | 2023.03.09 |