1. 程式人生 > >JSP異常處理

JSP異常處理

 

JSP異常處理

 

當編寫JSP程式的時候,程式設計師可能會遺漏一些BUG,這些BUG可能會出現在程式的任何地方。JSP程式碼中通常有以下幾類異常:

檢查型異常:檢查型異常就是一個典型的使用者錯誤或者一個程式設計師無法預見的錯誤。
舉例來說,如果一個檔案將要被開啟,但是無法找到這個檔案,則一個異常被丟擲。這些異常不能再編譯期被簡單地忽略。
執行時異常:一個執行時異常可能已經被程式設計師避免,這種異常在編譯期將會被忽略。
錯誤:這裡沒有異常,但問題是它超出了使用者或者程式設計師的控制範圍。錯誤通常會在程式碼中被忽略,幾乎不能拿它怎麼樣。
舉例來或,棧溢位錯誤。這些錯誤都會在編譯期被忽略。

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

 

使用Exception物件


exception物件是Throwable子類的一個例項,只在錯誤頁面中可用。下表列出了Throwable類中一些重要的方法:


方法&描述


public String getMessage()
返回異常的資訊。這個資訊在Throwable建構函式中被初始化


public ThrowablegetCause()
返回引起異常的原因,型別為Throwable物件


public String toString()
返回類名


public void printStackTrace()
將異常棧軌跡輸出至System.err

 

public StackTraceElement [] getStackTrace()
以棧軌跡元素陣列的形式返回異常棧軌跡

 

public ThrowablefillInStackTrace()
使用當前棧軌跡填充Throwable物件

 

 

JSP提供了可選項來為每個JSP頁面指定錯誤頁面。無論何時頁面丟擲了異常,JSP容器都會自動地呼叫錯誤頁面。

為main.jsp指定了一個錯誤頁面。使用<%@page errorPage="XXXXX"%>指令指定一個錯誤頁面。


<%@ 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編譯器需要產生一個異常例項變數。

 

 


在錯誤頁面中使用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>

 

 

使用 try…catch塊


如果想要將異常處理放在一個頁面中,並且對不同的異常進行不同的處理,那麼就需要使用try…catch塊了。

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