JSP 異常處理

JSP 異常處理

當編寫JSP程序的時候,程序員可能會遺漏一些BUG,這些BUG可能會出如今程序的任何地方。JSP代碼中一般有如下幾類異常:html

  • 檢查型異常:檢查型異常就是一個典型的用戶錯誤或者一個程序員沒法預見的錯誤。舉例來講,若是一個文件將要被打開,可是沒法找到這個文件,則一個異常被拋出。這些異常不能再編譯期被簡單地忽略。
  • 運行時異常:一個運行時異常可能已經被程序員避免,這種異常在編譯期將會被忽略。
  • 錯誤:錯誤不是異常,但問題是它超出了用戶或者程序員的控制範圍。錯誤一般會在代碼中被忽略,您幾乎不能拿它怎麼樣。舉例來講,棧溢出錯誤。這些錯誤都會在編譯期被忽略。

本節將會給出幾個簡單而優雅的方式來處理運行時異常和錯誤。java

使用Exception對象

exception對象是Throwable子類的一個實例,只在錯誤頁面中可用。下表列出了Throwable類中一些重要的方法:程序員

序號 方法&描述
1 public String getMessage()

 

返回異常的信息。這個信息在Throwable構造函數中被初始化
2 public ThrowablegetCause()

 

返回引發異常的緣由,類型爲Throwable對象
3 public String toString()

 

返回類名
4 public void printStackTrace()

 

將異常棧軌跡輸出至System.err
5 public StackTraceElement [] getStackTrace()

 

以棧軌跡元素數組的形式返回異常棧軌跡
6 public ThrowablefillInStackTrace()

 

使用當前棧軌跡填充Throwable對象

JSP提供了可選項來爲每一個JSP頁面指定錯誤頁面。不管什麼時候頁面拋出了異常,JSP容器都會自動地調用錯誤頁面。數組

接下來的例子爲main.jsp指定了一個錯誤頁面。使用<%@page errorPage="XXXXX"%>指令指定一個錯誤頁面。jsp

<%@ 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>

如今,編寫ShowError.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()); %>

注意到,ShowError.jsp文件使用了<%@page isErrorPage="true"%>指令,這個指令告訴JSP編譯器須要產生一個異常實例變量。spa

如今試着訪問main.jsp頁面,它將會產生以下結果:.net

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

Opps...
Sorry, an error occurred.

Here is the exception stack trace:

在錯誤頁面中使用JSTL標籤

能夠利用JSTL標籤來編寫錯誤頁面ShowError.jsp。這個例子中的代碼與上例代碼的邏輯幾乎同樣,可是本例的代碼有更好的結構,而且可以提供更多信息:code

<%@ 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>

運行結果以下:htm

jsp-exeception-1

使用 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
相關文章
相關標籤/搜索