JSP——异常处理


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

检查异常

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

运行时异常

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

错误

这些根本不是例外,而是用户或程序员无法控制的问题。代码中的错误通常会被忽略,因为您很少对错误采取任何措施。例如,如果发生堆栈溢出,就会出现错误。它们在编译时也会被忽略。

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

使用异常对象

异常对象是 Throwable 子类的实例(例如,java.lang.NullPointerException),并且仅在错误页面中可用。下表列出了 Throwable 类中可用的重要方法。

编号 方法与说明
1

公共字符串 getMessage()

返回有关已发生的异常的详细消息。该消息在 Throwable 构造函数中初始化。

2

公共 Throwable getCause()

返回由 Throwable 对象表示的异常原因。

3

公共字符串 toString()

返回与getMessage()结果连接的类的名称。

4

公共无效 printStackTrace()

将toString()的结果以及堆栈跟踪打印到System.err (错误输出流)。

5

公共 StackTraceElement [] getStackTrace()

返回一个包含堆栈跟踪上每个元素的数组。索引 0 处的元素表示调用堆栈的顶部,数组中的最后一个元素表示调用堆栈底部的方法。

6

公共 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