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 
廣告
© . All rights reserved.