1. 程式人生 > >Servlet的異常處理機制

Servlet的異常處理機制

一.在Servlet中,有兩種伺服器端異常處理機制
1.宣告試異常處理(declarative exception handling) 2.程式試異常處理(programmatic exception handling) 宣告試異常處理 宣告試異常處理是在web.xml檔案中宣告對各種異常的處理方法,這是通過<error-page>元素來宣告的.

<error-page>

<error-code>or<exception-type>

<location>

其中<error-code>元素指定HTTP的錯誤程式碼,<exception-type>元素指定JAVA異常類的完整限定名.

<location>元素給出用於響應HTTP錯誤程式碼或者JAVA異常的資源的路徑,該路徑是相對於WEB應用程式根路徑的位置.

<error-page>元素可以宣告兩種型別的錯誤處理:一是指定對HTTP錯誤程式碼的處理,二是指定對程式中產生的JAVA異常的處理.

二.HTTP錯誤程式碼的處理

在WEB.XML檔案中對HTTP404錯誤指定相應的錯誤處理頁面.

<error-page>

<error-code>404</error-code>

<location>/FileNotFound.html</location>//該路徑為相對於WEB應用程式根路徑的位置,必須以/開頭.

</error-page>

在上例中<error-code>元素指定了HTTP的錯誤程式碼,<location>子元素指定了響應HTTP404錯誤的頁面路徑.

三.JAVA異常的處理

利用<error-page>元素還可以宣告對程式中產生的JAVA異常的處理,例如一個SERVLET從檔案中讀取配置資訊,如果該檔案不存在,就會丟擲java.io.FileNotFoundException異常.例:

<error-page>
<exception-type>java.io.FileNotFoundException</exception-type>
<location>/ExcepHandler</location>
</error-page>

在<error-page>元素中,<exception-type>子元素指定了JAVA異常類的名字,<location>子元素指定了對異常進行處理的servlet類,當然,也可以指定一個靜態頁面對異常進行響應.

宣告試異常處理主要是在WEB.XML檔案中宣告對各種異常的處理方法,他的好處是開發人員在開發WEB應用程式時無須考慮什麼時候會產生HTTP錯誤或丟擲JAVA異常,這些都交給SERVLET容器進行處理,他的缺點是,必須針對可能出現的各種錯誤情況定義處理頁面或SERVLET,否則某些HTTP錯誤或異常將無法處理.

程式試異常處理

程式異常處理就是在WEB程式中利用TRY-CATCH語句來捕獲的異常,並對捕獲的異常進行相應的處理.

一.使用RequestDispatcher來處理異常

利用RequestDispathcher將請求轉發給其他的SERVLET進行處理,也可以將異常封裝在一個請求中,然後利用RequestDispatcher轉發給一個異常處理SERVLET進行統一的處理.

如果在一個WEB應用程式,有多個SERVLET可能丟擲相同的異常,採用這種方式對異常進行處理,可以避免在多個SERVLET中編寫同樣的異常處理程式碼.

例:

try{

int a=5;

int b=0;

int c=a/b;

}

catch(ArithmeticException e){

req.setAttribute("javax.servlet.eror.exception",e);

req.setAttribute("javax.servlet.error.request_uri",req.getRequestURI());

RequestDispatcher rd=req.getRequestDispatcher("xxxxx");

rd.forward(req,resp);

}

我們將丟擲異常的SERVLET的位置做為HttpServletRequest物件的屬性儲存到請求物件中,然後通過RequestDispatcher物件的forward()方法將請求轉發給XXXX,而XXXXX可以從請求物件中取出異常物件和位置.

XXX.SERVLET:

String uri=(String)req.getAttribut("javax.servlet.error.request_uri")

Object excep=req.getAttribute("javax.servlet.error.exception")

通過上面這2句可以從某個丟擲異常的SERVLET中取出異常物件和丟擲異常的SERVLET的位置做為req.getAttribut的引數獲取出來進行處理.

顯示為:/xxx/xxx    //WEB應用/某SERVLET

java.lang.arithmeticException: /by zero  //何種異常

宣告試異常處理實現簡單,直接在WEB.XML檔案中進行配置就可以,可以處理HTTP錯誤程式碼和JAVA異常,缺點是異常處理很單一,針對每種異常都需要在WEB.XML檔案中進行配置,由於丟擲異常的異常被SERVLET容器處理並做出響應,無法得知是那段程式程式碼出現了問題.

程式試異常處理容易瞭解異常在程式碼中的位置,而且對於同一種異常,可以由不同的程式段丟擲,並在catch語句中進行處理,還可以利用RequestDispatcher將不同的異常交給同一個servlet進行統一處理. 缺點是無法處理HTTP錯誤,編碼量大.