在这一章。 我们将讨论如何处理JSP中的异常。当编写JSP代码时,可能会导致代码错误发生在代码的任何部分。JSP代码中可能会出现以下类型的错误 -
检查异常
检查异常是一个例外,通常是用户错误或程序员无法预见的问题。 例如,如果要打开文件,但找不到文件,则会发生异常。编译时不能简单地忽略这些异常。
运行时异常
运行时异常是程序员可能避免的一种例外。与检查异常相反,运行时异常在并发时被忽略。
错误
错误并不是例外,而是出现在用户或程序员控制之外的问题。代码中通常会忽略错误,因为很少会对错误做任何事情。例如,如果发生堆栈溢出,则会出现错误。编译时也会被忽略。
下面我们将进一步讨论如何处理JSP代码中出现的运行时异常/错误。
使用Exception对象
Exception
对象是Throwable
子类的一个实例(例如,java.lang.NullPointerException
),仅在错误页面中可用。下表列出了Throwable
类中可用的重要方法。
编号 | 方法 | 描述 |
---|---|---|
1 | public String getMessage() |
返回有关发生的异常的详细消息。此消息在Throwable 构造函数中初始化。 |
2 | public Throwable getCause() |
返回由Throwable 对象表示的异常的原因。 |
3 | public String toString() |
返回与getMessage() 的结果连接的类的名称。 |
4 | public void printStackTrace() |
将toString() 的结果与堆栈跟踪一起打印到System.err 错误输出流。 |
5 | public StackTraceElement [] getStackTrace() |
返回一个包含堆栈跟踪中每个元素的数组。索引0 处的元素表示调用堆栈的顶部,数组中的最后一个元素表示调用堆栈底部的方法。 |
6 | public Throwable fillInStackTrace() |
使用当前堆栈跟踪填充Throwable 对象的堆栈跟踪,添加堆栈跟踪中的任何先前信息。 |
JSP提供了一个选项用来为每个JSP指定错误页面。每当页面引发异常时,JSP容器将自动调用错误页面。
以下是一个示例来指定index.jsp
的错误页面。要设置错误页面,请使用<%@ page errorPage =“xxx”%>
指令。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page errorPage="ErrorPage.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误页面示例</title>
</head>
<body>
<%
// Throw an exception to invoke the error page
int x = 1;
if (x == 1) {
throw new RuntimeException("Error condition!!!");
}
%>
</body>
</html>
现在编写一个错误处理ErrorPage.jsp
,如下所示。 请注意,错误处理页面包含指令<%@ page isErrorPage =“true”%>
。 该指令使JSP编译器生成异常实例变量。
文件:**
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误显示页面</title>
</head>
<body>
<h2>错误显示页面...</h2>
<p>Sorry, an error occurred.</p>
<p>Here is the exception stack trace:</p>
<pre>
<%
exception.printStackTrace(response.getWriter());
%>
</pre>
</body>
</html>
访问index.jsp
,将收到一个类似于以下内容的输出 -
使用JSTL标签编写错误页面
可以使用JSTL标签来编写错误页面ErrorPage2.jsp
。 该页面具有与上述示例中具有差不多相同的逻辑,具有更好的结构和更多信息 -
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误显示页面</title>
</head>
<body>
<h2>错误显示页面...</h2>
<table width="100%" border="1">
<tr valign="top">
<td width="40%"><b>Error:</b></td>
<td>${pageContext.exception}</td>
</tr>
<tr valign="top">
<td><b>URI:</b></td>
<td>${pageContext.errorData.requestURI}</td>
</tr>
<tr valign="top">
<td><b>Status code:</b></td>
<td>${pageContext.errorData.statusCode}</td>
</tr>
<tr valign="top">
<td><b>Stack trace:</b></td>
<td><c:forEach var="trace"
items="${pageContext.exception.stackTrace}">
<p>${trace}</p>
</c:forEach></td>
</tr>
</table>
</body>
</html>
访问index.jsp
,将收到一个类似于以下内容的输出 -
使用try…catch块
如果要处理同一页面中的错误,并希望采取一些措施,而不是触发错误页面,则可以使用try....catch
块。
以下是一个简单的例子,显示如何使用try...catch
块。把下面的代码放在try-catch.jsp
中 -
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Try...Catch示例</title>
</head>
<body>
<div style="margin: auto; width: 90%">
<%
try {
int i = 1;
i = i / 0;
out.println("The answer is " + i);
} catch (Exception e) {
out.println("An exception occurred: " + e.getMessage());
}
%>
</div>
</body>
</html>
访问http://localhost:8080/ExceptionHandling/try-catch.jsp
,它应该生成一个类似于以下内容的输出 -
An exception occurred: / by zero