JSP - 异常处理



本章将讨论如何在JSP中处理异常。编写JSP代码时,可能会出现编码错误,这些错误可能出现在代码的任何部分。JSP代码中可能会出现以下类型的错误:

已检查异常

已检查异常是一种通常是用户错误或程序员无法预见的问题的异常。例如,如果要打开一个文件,但找不到该文件,则会发生异常。这些异常在编译时不能简单地忽略。

运行时异常

运行时异常是程序员可能本来可以避免的异常。与已检查异常相反,运行时异常在编译时会被忽略。

错误

这些根本不是异常,而是超出用户或程序员控制范围的问题。错误通常在您的代码中被忽略,因为您很少能对错误做些什么。例如,如果发生堆栈溢出,则会发生错误。它们在编译时也会被忽略。

我们将进一步讨论处理JSP代码中发生的运行时异常/错误的方法。

使用异常对象

异常对象是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容器都会自动调用错误页面。

以下是如何为main.jsp指定错误页面的示例。要设置错误页面,请使用<%@ page errorPage = "xxx" %>指令。

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

<html>
   <head>
      <title>Error Handling Example</title>
   </head>
   
   <body>
      <%
         // Throw an exception to invoke the error page
         int x = 1;
         
         if (x == 1) {
            throw new RuntimeException("Error condition!!!");
         }
      %>
   </body>
</html>

我们现在将编写一个错误处理JSP ShowError.jsp,如下所示。请注意,错误处理页面包含指令<%@ page isErrorPage = "true" %>。此指令使JSP编译器生成异常实例变量。

<%@ page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <p>Sorry, an error occurred.</p>
      <p>Here is the exception stack trace: </p>
      <pre><% exception.printStackTrace(response.getWriter()); %></pre>
   </body>
</html>

访问main.jsp,您将收到类似于以下的输出:

java.lang.RuntimeException: Error condition!!!
......

Opps...
Sorry, an error occurred.

Here is the exception stack trace:

使用JSTL标签进行错误页面处理

您可以使用JSTL标签编写错误页面ShowError.jsp。此页面与上述示例中的逻辑几乎相同,但结构更好,信息更多:

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <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>

访问main.jsp,将生成以下内容:

Opps...

Error:

java.lang.RuntimeException: Error condition!!!

URI:

/main.jsp

Status code:

500

Stack trace:

org.apache.jsp.main_jsp._jspService(main_jsp.java:65)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

使用Try...Catch块

如果您想在同一页面中处理错误,并希望采取某些操作而不是触发错误页面,则可以使用try....catch块。

以下是一个简单的示例,演示如何使用try...catch块。让我们将以下代码放入main.jsp中:

<html>
   <head>
      <title>Try...Catch Example</title>
   </head>
   
   <body>
      <%
         try {
            int i = 1;
            i = i / 0;
            out.println("The answer is " + i);
         }
         catch (Exception e) {
            out.println("An exception occurred: " + e.getMessage());
         }
      %>
   </body>
</html>

访问main.jsp,它应该生成类似于以下的输出:

An exception occurred: / by zero 
广告