티스토리 뷰
<출처 : 쉽게 배우는 JSP 웹 프로그래밍>
예외 처리
- 예외처리의 개요
- page 디렉티브 태그를 이용한 예외 처리
- web.xml 파일을 이용한 예외 처리
- try-catch-finally 를 이용한 예외처리
- - 예외처리의 개요
: 프로그램이 실행동안 문제가 발생 했을 때 처리를 중단하고 다른 처리를 하는 것을 예외처리라고 한다.
예외처리 방법은 3가지가 있다.
- page 디렉티브 태그 이용 : errorpage 와 isErrorPage 속성을 이용
- web.xml 파일을 이용 : <error-code>, <exception-type> 요소를 이용
- try-catch-finally 이용 : 자바 언어의 예외 처리 구문 사용
#예외처리 우선순위#
- JSP페이지에서 try-catch-finally 문으로 처리하는 경우 오류 출력
- page 디렉티브 태그의 errorPage 속성에서 설정한 오류 페이지 출력
- JSP 페이지에서 예외 유형이 web.xml 파일에서 설정한 예외 유형과 동일한 경우 설정한 오류 페이지 출력
- JSP 페이지에서 발생한 오류 콛가 web.xml 파일에서 설정한 오류 코드와 동일한 경우 오류코드 출력
- 위 항목이 해당되지 않는 경우 기본오류 페이지 출력
- page 디렉티브 태그를 이용한 예외 처리
## errorPage 속성으로 오류 페이지 호출
: <%@ page errorPage = "오류페이지 URL" %>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page errorPage = "errorPage_error.jsp" %>
<html>
<head>
<title>Exception</title>
</head>
<body>
name 파라미터 : <%= request.getParameter("name").toUpperCase() %>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
오류 발생!
</body>
</html>
첫 번째 파일 : errorPage.jsp // 두 번째 파일 : errorPage_error.jsp
-> errorPage 디렉티브 태그에 errorPage_error.jsp 에러페이지 주소를 작성.
파라미터로 입력받은 name을 대문자로 바꿔 출력 하지만, 입력받을 name이 존재하지 않기에 오류 발생!
errorPage_error.jsp 페이지 호출됨
## isErrorPage 속성으로 오류 페이지 만들기
<%@ page isErrorPage = "true" %>
isErrorPage 속성은 현재 JSP 페이지를 오류 페이지로 호출하는 page 디렉티브 속성이다.
오류 페이지에서는 exception 내장 객체를 사용할 수 있다.
내장객체 메서드
- getMessage() : 오류 이벤트와 함께 들어오는 메시지 출력
- toString() : 오류 이벤트의 toString()을 호출 출력
- printStackTrace() : 오류 메시지의 발생 근원을 찾아 단계별로 출력 (함부로 사용하면 안됨)
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<form action="exception_process.jsp" method="get">
<p> 숫자 : <input type="text" name="num1">
<p> 숫자 : <input type="text" name="num2">
<p> <input type="submit" value="나누기">
</form>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page errorPage = "exception_error.jsp" %>
<html>
<head>
<title>Exception</title>
</head>
<body>
<%
String num1 = request.getParameter("num1");
String num2 = request.getParameter("num2");
int a = Integer.parseInt(num1);
int b = Integer.parseInt(num2);
int c = a / b;
out.print(num1 + " / " + num2 + " = " + c);
%>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page isErrorPage = "true" %>
<html>
<head>
<title>Exception</title>
</head>
<body>
<p> 오류 발생! 오류 내용 보여주기 exception 내장객체의 메서드 이용
<p> 예외 : <%=exception%>
<p> toString() : <%=exception.toString() %>
<p> getMessage() : <%=exception.getMessage() %>
<p> getClass().getName() : <%=exception.getClass().getName() %>
</body>
</html>
exception.jsp // exception_process.jsp // exception_error.jsp 세 개의 파일을 작성
- exception.jsp : form 태그를 사용하여 값을 입력 받는다. action page는 exception_process.jsp로 작성
- exception_process.jsp : 입력받은 숫자 num1, num2를 나눈다. 즉, 연산처리 파일.
- exception.error.jsp : 연산처리 과정에서 예외가 발생할 경우 해당 페이지 출력한다. exception 내장객체의 메서드를 활용하여 예외 내용 출력
- web.xml 파일을 이용한 예외 처리
: web.xml 파일에 처리할 오류코드나 오류 유형및 페이지 호출 정보를 작성
<error-page>
<error-code>오류 코드</error-code>|<exception-type>오류 유형</exception-type>
<location>오류페이지 URL 작성</location>
</error-page>
주요 오류 코드
- 404 : 지정된 URL을 처리하기 위한 자원이 존재하지 않음.
- 500 : 서버 내부의 에러(JSP에서 예외가 발생하는 경우)
## 예외 유형으로 오류 페이지 호출
: JSP 에 발생하는 오류가 web.xml 파일에 설정된 예외 유형과 일치하는 경우 해당 예외 유형과 오류 페이지 보여줌.
<error-page>
<exception-type>예외 유형</exception-type>
<location>오류페이지 URL 작성</location>
</error-page>
# 주요 예외 유형의 종류
- ClassNotFoundExeption : 클래스를 찾지 못함
- NullPointerException : null 오브젝트로 접근할 때 발생
- ClassCastException : 변환할 수 있는 유형으로 각체를 변환할 때
- OutOfMemoryException : 메모리 부족으로 메모리 확보하지 못할 때
- StackOverFlowError : 스택 오버플로우 발생
- ArrayIndexOutOfBoundException : 범위 밖의 배열을 사용할 경우
- NegativeArraySizeException : 음수로 배열의 크기 설정
- illegalArgumentException : 부적절한 문자열을 숫자로 치환하려 할 때
- IOException : 요청된 메서드가 허용되지 않을 때
- NumberFormatException : 부적절한 문자열을 숫자로 치환하려 할 때
- ArithmeticException : 연산시 문제 (어떤 숫자를 0으로 나누려 할 때)
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<form action="errorCode_process.jsp" method="post">
<p> 숫자1 : <input type="text" name="num1">
<p> 숫자2 : <input type="text" name="num2">
<p> <input type="submit" value="나누기">
</form>
</body>
</html>
==========
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<%
String num1 = request.getParameter("num1");
String num2 = request.getParameter("num2");
int a = Integer.parseInt(num1);
int b = Integer.parseInt(num2);
int c = a / b;
out.print(num1 + " / " + num2 +" = "+c);
%>
</body>
</html>
============
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
errorCode 505 발생
오류 내용 => web.xml 작성!!
</body>
</html>
form 태그를 작성한 jsp 파일에 숫자를 입력하여 액션이 취해진 페이지로 데이터를 보낸다.
action에 있던 주소 페이지는 작동하여 parameter로 값을 받아와 계산한다.
web.xml 에 오류상태와 오류페이지를 작성하였기에 오류가 발생시 web.xml 에 작성한대로 <location>에 작성한 페이지가 호출된다.
- try-catch-finally 를 이용한 예외처리
: 자바의 예외처리 구문을 스크립틀릿 태그에 작성하여 예외처리 함
# 서블릿에서 jsp 호출 => forward() 와 include() 메서드의 차이
: forward -> 페이지 호출 순간 서블릿이 멈추고 JSP 페이지로 넘어가 실행 후 프로그램 끝
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("파일.jsp");
request.setAttribute("name", "value");
rd.forward(request, response);
: include -> JSP 페이지가 실행된 후 나머지 서블릿 프로그램 실행
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("파일.jsp");
rd.include(request, response);
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<form action="tryCatch_process.jsp" method="get">
<p> 숫자 : <input type="text" name="num1">
<p> 숫자 : <input type="text" name="num2">
<p> <input type="submit" value="전송">
</form>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<%
try{
String num1 = request.getParameter("num1");
String num2 = request.getParameter("num2");
int a = Integer.parseInt(num1);
int b = Integer.parseInt(num2);
int c = a / b;
out.print(num1 + " / " + num2 + " = " + c);
} catch(NumberFormatException e){
RequestDispatcher dispatcher = request.getRequestDispatcher("tryCatch_error.jsp");
dispatcher.forward(request, response);
}
%>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<p> 잘못된 데이터가 입력
<p> <%="숫자1 : " + request.getParameter("num1") %>
<p> <%="숫자2 : " + request.getParameter("num2") %>
</body>
</html>
자바의 예외처리 구문은 try-catch-finally 구문을 스크립틀릿 태그에 작성하여 예외를 처리한다.
<출처 : 쉽게 배우는 JSP 웹 프로그래밍>