티스토리 뷰

코딩/JSP

[10주 3일차] 예외 처리

ehzim 2023. 12. 13. 17:45

CHAPTER11. 예외 처리 : 예외 처리 페이지 만들기

 

 

 

1. 예외 처리의 개요

 

예외 처리는 프로그램이 처리되는 동안 특정한 문제가 발생했을 때 처리를 중단하고 다른 처리를 하는 것이다.

이것을 오류 처리라고도 한다.

 

웹 애플리케이션 실행 중에 발생할 수 있는 오류에 대비한 예외 처리 코드를 작성하여 비정상적인 종료를 막을 수 있다.

되게 오류가 생기면 실행이 종료되는데 그렇지 않고 실행을 유지할 수 있게한다.

 

 

- 예외 처리 방법의 종류

예외 처리 방법 설명
page 디렉티브 태그를 이용한 예외 처리 errorPage와 isErrorPage 속성을 이용한다. (해당페이지에서 실행)
web.xml 파일을 이용한 예외 처리 <error-code> 또는 <exception-type> 요소를 이용한다.
try/catch/finally를 이용한 예외 처리 자바 언어의 예외 처리 구문을 이용한다.
(제일 내부에 위치한다. (자바코드에서 실행))

 

* 우선 순위 try catch finally → page → web.xml

* 실행 순서 web.xml (제일 외부에 위치해서 선제적으로 거른다.)  → page → try catch finally  (페이지 안의 자바 코드에서 실행한다.)

 

 

 

 

 

 

2. page 디렉티브 태그를 이용한 예외 처리

 

page 디렉티브 태그를 이용한 예외 처리는 page 디렉티브 태그에 errorPage와 isErrorPage 속성을 사용해 오류 페이지를 호출한다.

 

 

 

 

2.1 errorPage 속성으로 오류 페이지 호출하기

 

JSP 페이지가 실행되는 도중에 오류가 발생하면 웹 서버의 기본 오류 페이지를 대신해 errorPage 속성에 설정한 페이지가 오류 페이지로 호출된다.

 

<%@ page errorPAge="오류 페이지 URL" %>

 

 

 

errorPage 속성 사용 예시

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ page errorPage="error.jsp" %> 
<html>
<head>
<title>Exception</title>
</head>
<body>
<%
	String value = session.getAttribute("id").toString();
%>
</body>
</html>

 

 

 

session.getAttribute("id").toString();

 

위의 코드는 오류가 발생하는 부분을 보여준다.

이때 오류가 발생하면 밑의 코드로 인해 오류 페이지를 호출한다.

 

<%@ page errorPage="error.jsp" %>

위의 코드는 오류 페이지를 호출하는 것이다.

만약 오류가 발생하면 지정된 error.jsp 페이지로 이동한다.

 

 

 

 

* 상대경로 절대경로 차이

상대 경로는 시작점이 없다 ex) /로 시작하지 않는다. ./ or 폴더명은 가능하다.

절대 경로는 시작점이 존재한다. 경로 시작이 무조건 /부터 시작한다.

 

 

 

 

 

page 디렉티브 태그에 errorPage 속성을 이용하여 오류 페이지 호출하기

예제 11-1

 

errorpage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page errorPage="errorpage_error.jsp" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	name 파라미터 : <%=request.getParameter("name").toUpperCase() %>
</body>
</html>

 

page errorPage="errorpage_error.jsp를 입력하여 오류 발생시 이동할 경로를 지정해주었다.

 

toUpperCase는 대문자로 변환하여 출력하는 것을 뜻하고 이때 name의 값이 존재하지 ㅇ낳으면 오류가 발생한다.

 

 

 

errorpage_error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	오류가 발생하였습니다.
</body>
</html>

 

결과

결과를 보면 값이 없기때문에 오류가 발생하여 errorpage_error.jsp 로 이동하여 오류 메시지가 출력된 것을 볼 수 있다.

 

 

 

 

 

 

 

2.2 isErrorPage 속성으로 오류 페이지 만들기

 

isErrorPage 속성은 현재 JSP 페이지를 오류 페이지로 호출하는 page 디렉티브 태그의 속성이다.

오류처리 페이지를 만들어 호출하는 것으로 Exception 내장객체를 가지며 java의 throws랑 비슷하다.

 

<%@ page isErrorPage = "true" %>

이때 true이면 Exception 객체가 생성된다.

 

 

 

- exception 내장 객체의 메소드

메소드 형식 설명
getMessage() String 오류 이벤트와 함께 들어오는 메시지를 출력한다.
toString() String 오류 이벤트의 toString()을 호출하여 간단한 오류 메시지를 확인한다.
printStackTrace() String 오류 메시지의 발생 근우너지를 찾아 단계별로 오류를 출력한다.

 

 

 

 

 

page 디렉티브 태그에 isErrorPage 속성을 이용하여 오류 페이지 만들기

예제 11-2

 

iserrorpage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page errorPage="iserrorpage_error.jsp" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	name 파라미터 : <%=request.getParameter("name").toUpperCase() %>
</body>
</html>

 

page 디렉티브 태그의 errorPage를 사용하여 에러가 발생하면 이동할 페이지를 지정해주었다.

 

 

iserrorpage_error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p>오류가 발생하였습니다.
	<p> 예외 유형 : <%=exception.getClass().getName() %>
	<p> 오류 메시지 : <%=exception.getMessage() %>
</body>
</html>

isErrorPage="true" 를 사용하여 exception 객체를 생성하고 exception 객체 안의 getName() 메소드를 사용하여 예외 유형(클래스 이름을 가져옴)을 출력하고 getMessage() 메소드를 사용하여 오류 메시지를 출력했다.

 

*오류 메시지를 가져오는 방법은 Exception ex = new Exception("오류"); 의 명령어도 존재한다.

이때와의 차이는 직접 생성하여 사용시 오류 메세지를 따로 작성할 수 있지만 위와 같이 isErrorPage를 사용하여 객체를 생성 후 exception 객체를 사용하여 오류 메세지를 출력시 따로 작성할 수 없다.

 

 

 

결과

 

 

 

 

 

page 디렉티브 태그에 errorPage와 isErrorPage 속성을 이용하여 예외 처리하기

예제 11-3

 

exception.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="exception_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>

 

input 상자를 만들어 form을 submit 하면 exception_process.jsp으로 이동하도록 연결시켜주었다.

 

 

 

exception_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page errorPage="exception_error.jsp" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</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>

 

오류가 발생하면 exception_error.jsp 로 이동하도록 연결해주었다.

그리고 입력받은 value를 변수에 담아 정수로 형변환을 시켜 연산을 해주었다.

 

 

 

exception_error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p>오류가 발생하였습니다.
	<p> 예외 : <%=exception %>
	<p> toString() : <%=exception.toString() %>
	<p> getClass().getName() : <%=exception.getClass().getName() %>
	<p> getMessage() : <%=exception.getMessage() %>
</body>
</html>

 

isErrorPage=true 을 하여 exception 객체를 생성하고 exception의 주소를 가져온다.

toString() 메소드를 사용하여 오류 메시지를 확인하고  

exception.getClass().getName() 예외 유형? 클래스 이름을 가져온다.

exception.getMessage()는 오류가 생긴 메세지를 가져온다.

 

 

결과

 

 

 

 

3. web.xml 파일을 이용한 예외 처리

 

web.xml 파일을 이용한 예외 처리는 web.xml 파일을 통해 오류 상태와 오류 페이지를 보여주는 방법이다.

<error-page>...</error-page> 요소 내에 처리할 오류 코드 또는 오류 유형 및 오류 페이지를 호출한다.
web.zml 파일은 웹 애플리케이션의 WEB-INF 폴더에 존재해야한다.

 

<error-page>
    <error-code>...</error-code>|<exception-type>...</exception-type>
    <location>...</location>
</errot-page>

 

 

- <error-page>를 구성하는 하위 요소

요소 설명
<error-code> 오류 코드를 설정하는데 사용한다.
<exception-type> 자바 예외 유형의 정규화된 클래스 이름을 설정하는데 사용한다. (=catch, 생략가능함)
<location> 오류 페이지의 URL을 설정하는데 사용한다.

 

 

 

 

 

 

3.1 오류 코드로 오류 페이지 호출하기

 

오류 코드는 웹 서버가 제공하는 기본 오류 페이지에 나타나는 404, 500과 같이 사용자의 요청이 올바르지 않을 때 출력되는 코드로 응답 상태 코드라고도 한다.

JSP 페이지에서 발생하는 오류가 web.xml 파일에 설정된 오류 코드와 일치하는 경우 오류 코드와 오류 페이지를 보여준다.

 

 

<error-page>
    <error-code>오류 코드</error-code>
    <location>오류 페이지의 URI</location>
</error-page>

 

- 주요 오류 코드의 종류

코드 설명
200 요청이 정상적으로 처리된다. 
307 임시로 페이지가 리다이렉트된다.
400 클라이언트의 요청이 잘못된 구문으로 구성된다. (클라이언트)
401 접근이 허용되지 않는다. (클라이언트)
404 지정된 URL을 처리하기 위한 자원이 존재하지 않는다.(페이지 없음) (클라이언트)
405 요청된 메소드가 허용되지 않는다. (클라이언트)
500 서버 내부의 에러이다.(JSP 에서 예외가 발생하는 경우) (서버)
503 서버가 일시적으로 서비스를 제공할 수 없다.(서버 과부하나 보수 중인 경우)  (서버)

 

 

 

 

 

web.xml 파일에 오류 코드로 오류 페이지 호출하기

예제 11-4

 

web.xml

	</login-config>
	<error-page>
		<error-code>500</error-code>
		<location>/errorcode_error.jsp</location>
	</error-page>
</web-app>

web.xml에 추가한다.

에러 코드를 입력하고 오류 페이지의 URL을 지정한다.

 

 

errorcode.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</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>

 

errorcode_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	errorcode 505 오류가 발생하였습니다.
</body>
</html>

 

errorcode_error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	오류가 발생하였습니다.
</body>
</html>

 

결과 

 

 

 

3.2 예외 유형으로 오류 페이지 호출하기

 

예외 유형에 따른 오류 페이지 호출 방법은 JSP 페이지가 발생시키는 오류가 web.xml 파일에 설정된 예외 유형과 일치하는 경우 예외 유형과 오류 페이지를 보여준다.

 

<error-page>
    <exception-type>예외 유형</exception-type>
    <location>오류 페이지의 URI</location>
</error-page>

 

 

 

- 주요 예외 유형의 종류

예외 유형 설명
ClassNotFoundException 클래스를 찾지 못했을 때 발생한다.
NullPointerException null 오브젝트로 접근했을 때 발생한다.
ClassCastException 변환할 수 있는 유형으로 객체를 변환할 때 발생한다.
OutOfMemoryException 메모리 부족으로 메모리를 확보하지 못했을 떄 발생한다.
StackOverflowError 스택 오버플로일 때 발생한다.
ArrayIndexOutOfBoundException 범위 밖의 배열 첨자를 설정했을 때 발생한다.
NegativeArraySizeException 음수로 배열 크기를 설정했을 때 발생한다.
illegalArgumentException 부적절한 문자열을 수치로 변환하려 할 때 발생한다.
IOException 요청된 메소드가 허용되지 않을 때 발생한다.
NumberFormatException 부적절한 문자열을 수치로 변환하려 할 때 발생한다.
ArithmeticException 어떤 값을 0으로 나누었을 때 발생한다.

 

 

 

 

 

 

 

 

4. try-catch-finally를 이용한 예외 처리

 

try-catch-finally는 자바의 예외 처리 구문으로 스크립틀릿 태그에 작성한다.

사용법은 자바와 같다.

 

 

 

* 서블릿에서의 jsp 호출(forward와 inlcude 방식)

forward와 include 메소드는 모두 JSP 페이지를 호출할 수 있다.

하지만 차이점이 존재한다. 

 

forward() 메소드 방식

JSP 페이지를 호출하는 순간 서블릿 프로그램이 실행을 멈추고 JSP 페이지로 넘어가 그곳에서 실행하고 프로그램이 끝난다. just 다음 페이지로 이동만 하고 끝난다.

 

icnlude() 메소드 방식

JSP 페이지가 실행된 후 나머지 서블리 ㅅ프로그램이 실행된다.

페이지로 이동했다가 다시 온다.

 

 

 

 

 

try-catch-finally를 이용하여 예외 처리하기

예제 11-6

 

trycatch.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="trycatch_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>

 

trycatch_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</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>

 

trycatch_error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p> 잘못된 데이터가 입력되었습니다.
	<p> <%=" 숫자1 : "+request.getParameter("num1") %>
	<p> <%=" 숫자2 : "+request.getParameter("num2") %>
</body>
</html>

 

결과

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday