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錯誤,編碼量大.