JSP 异常处理

  • 异常处理

    在这一章当中。我们将讨论如何在JSP中处理异常。在编写JSP代码时,可能会出现编码错误,该错误可能发生在代码的任何部分。您的JSP代码中可能会发生以下类型的错误-
    检查异常
    检查的异常是通常为用户错误或程序员无法预见的问题的异常。例如,如果要打开文件,但找不到该文件,则会发生异常。这些异常不能在编译时简单地忽略。
    运行时异常
    运行时异常是程序员可能可以避免的异常。与检查的异常相反,在编译时会忽略运行时异常。
    错误
    这些根本不是异常,而是超出用户或程序员控制范围而产生的问题。错误通常会在代码中被忽略,因为您几乎无法对错误做任何事情。例如,如果发生堆栈溢出,则会出现错误。在编译时也将忽略它们。
    我们将进一步讨论处理JSP代码中发生的运行时异常/错误的方法。
  • 使用Exception对象

    Exception象是Throwable子类的实例(例如,java.lang.NullPointerException),并且仅在错误页面中可用。下表列出了Throwable类中可用的重要方法。-
    方法 说明
    public String getMessage() 返回有关已发生异常的详细消息。 该消息在Throwable构造函数中初始化。
    public Throwable getCause() 返回由Throwable对象表示的异常原因。
    public String toString() 返回与getMessage()的结果串联的类的名称。
    public void printStackTrace() 将toString()的结果与堆栈跟踪一起输出到错误输出流System.err。
    public StackTraceElement [] getStackTrace() 返回一个包含堆栈跟踪中每个元素的数组。 索引0处的元素表示调用堆栈的顶部,而数组中的最后一个元素表示调用堆栈底部的方法。
    public Throwable fillInStackTrace() 用当前堆栈跟踪填充此Throwable对象的堆栈跟踪,并添加到堆栈跟踪中的所有先前信息。
    JSP为您提供了一个选项,可以为每个JSP 指定错误页面。每当页面抛出异常时,JSP容器都会自动调用错误页面。以下是为main.jsp指定错误页面的示例。要设置错误页面,请使用<%@page errorPage =“xxx”%>指令。
    
    <%@ page errorPage = "ShowError.jsp" %>
    
    <html>
       <head>
          <title>错误处理实例</title>
       </head>
       
       <body>
          <%
             // 引发异常以调用错误页面
             int x = 1;
             
             if (x == 1) {
                throw new RuntimeException("错误情况!!!");
             }
          %>
       </body>
    </html>
    
    现在,我们将编写一个错误处理JSP ShowError.jsp,如下所示。请注意,错误处理页面包括指令<%@ page isErrorPage =“true”%>。该指令使JSP编译器生成异常实例变量。
    
    <%@ page isErrorPage = "true" %>
    
    <html>
       <head>
          <title>显示错误页面</title>
       </head>
       
       <body>
          <h1>Opps...</h1>
          <p>抱歉,发生错误。</p>
          <p>这是异常堆栈跟踪:</p>
          <pre><% exception.printStackTrace(response.getWriter()); %></pre> 
       </body>
    </html>
    
    访问main.jsp,您将收到错误输出-
  • 对错误页面使用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>
    
    JSTL运行依赖参考教程 : 》》》>>>>
  • 使用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