位置:首頁 > Java技術 > JSP教學 > JSP異常處理

JSP異常處理

當寫JSP代碼,程序員可能會留下它可以發生在任何部分代碼的編碼錯誤。有以下的錯誤類型在JSP代碼:

  • 檢查異常: 檢查異常是一個例外,通常是用戶錯誤或不能由程序員不可預見的問題。例如,如果一個文件被打開,但該文件無法找到,則會出現異常。這些例外並不能簡單地在編譯時被忽略。

  • 運行時異常: 運行時異常是發生,大概本來是可以由編程人員避免異常。而不是檢查異常,運行時異常是在編譯時忽略不計。

  • 錯誤: 這些都不是例外,但所出現超出用戶或程序員的控製問題。錯誤通常忽略了代碼,因為你可以減少做有關的錯誤。例如,如果發生堆棧溢出時,會產生一個錯誤。但在編譯的時候還是被忽略了。

本教學會給你一些簡單而優雅的方式來處理運行時產生在JSP代碼異常/錯誤。

使用異常對象:

異常對象是可拋出(例如,java.lang. NullPointerException)的一個子類的實例,並僅在錯誤頁麵使用。以下是在Throwable類中提供重要方法列表。

SN 方法和描述
1 public String getMessage()
Returns a detailed message about the exception that has occurred. This message is initialized in the Throwable constructor.
2 public Throwable getCause()
Returns the cause of the exception as represented by a Throwable object.
3 public String toString()
Returns the name of the class concatenated with the result of getMessage()
4 public void printStackTrace()
Prints the result of toString() along with the stack trace to System.err, the error output stream.
5 public StackTraceElement [] getStackTrace()
Returns an array containing each element on the stack trace. The element at index 0 represents the top of the call stack, and the last element in the array represents the method at the bottom of the call stack.
6 public Throwable fillInStackTrace()
Fills the stack trace of this Throwable object with the current stack trace, adding to any previous information in the stack trace.

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