橘子味的心
标题:JSP异常处理

在这一章。 我们将讨论如何处理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

分类