我們難保自己寫的程式不會出錯,所以需要一些錯誤處理機制來幫我們更好的解決異常,處理錯誤。在瀏覽網頁的時候,如果訪問的頁面不存在,那麼會收到一個HTTP 404錯誤資訊。這個問題的發生,可能是因為使用者輸入了錯誤的URL,但更多的情況是伺服器端的連結出現了錯誤,頁面移動了位置或者刪除了,卻忘記修改原來的連結。另外一種情況就是,我們開發的web應用程式本身有bug,在運行時出現了異常。
所以,這就要求我們在開發web應用時,對於可能出現的錯誤或異常,提前做好處理,即使錯誤不可避免,也應該提供一些友好的資訊。在servlet中,有兩種伺服器處理機制:聲明式異常處理(declarative exception handling)和程式式異常處理(programmatic exception handling)。
聲明式異常處理
這種異常處理方式是在web.xml檔案中聲明對各種異常的處理方法。其格式如下:
<?xml version='1.0' encoding='utf-8'?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"><error-page><error-code>404</error-code><location>/FileNotFound.html</location></error-page></web-app>
可以看出來,<error-code>指定HTTP的錯誤碼,<location>制定了錯誤出現時的頁面路徑。還有一種格式如下:
<?xml version='1.0' encoding='utf-8'?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"><error-page><error-type>java.io.FileNotFoundException</error-type><location>/ExceptionHandle</location></error-page></web-app>
其中<error-type>指定了java異常類的完整限定名,而<location>指定了處理異常的處理類(Servlet類)。在上面的那中格式中,<location>也可以這樣指定。
HTTP常見的錯誤碼詳見HTTP解析,文章有對HTTP的詳細說明。
一個異常處理類的詳細代碼如下所示:
package com.shan.web;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class HttpErrorHandleServlet extends HttpServlet{public void service(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html; charset=UTF-8");Integer status_code = (Integer)request.getAttribute("javax.servlet.error.status_code");out.println("<html><head><title>");out.println("錯誤頁面");out.println("</title></head>");out.println("<body>");switch(status_code) {case 401: break;case 404:out.println("HTTP狀態代碼:"+status_code);out.println("您訪問的頁面不存在,或者已被移動到其他位置。");break;default:break;}out.println("</body></html>");out.close();}}
為了協助進行錯誤處理的servlet分析問題,以及產生詳細的響應,servlet容器在將請求轉寄給錯誤頁面之前,會在請求中設定某些有用的屬性,如表1所示:
屬性的名字 |
屬性的類型 |
屬性說明 |
javax.servlet.error.status_code |
java.lang.Integer |
HTTP協議的狀態碼 |
javax.servlet.error.exception_type |
java.lang.Class |
未捕獲異常的Class類的對象 |
javax.servlet.error.message |
java.lang.String |
傳遞給sendError()方法的訊息,或者是在未捕獲異常中的訊息 |
javax.servlet.error.exception |
java.lang.Throwable |
調用錯誤頁面的未捕獲異常 |
javax.servlet.error.request_uri |
java.lang.String |
當前請求的URI |
javax.servlet.error.servlet_name |
java.lang.String |
導致錯誤頁面被調用的servlet的名字 |
表1 servlet容器在請求對象中設定的屬性
針對上面錯誤處理類的完整web.xml配置如下所示:
<?xml version='1.0' encoding='utf-8'?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"><servlet><servlet-name>HttpErrorHandleServlet</servlet-name><servlet-class>com.shan.web.HttpErrorHandleServlet</servlet-class></servlet><servlet-mapping><servlet-name>HttpErrorHandleServlet</servlet-name><url-pattern>/ExceptionHandle</url-pattern></servlet-mapping><error-page><error-code>401</error-code><location>/ExceptionHandle</location></error-page><error-page><error-code>404</error-code><location>/ExceptionHandle</location></error-page></web-app>
程式式異常處理
這種異常處理方式利用try-catch來捕獲異常,並對捕獲的異常進行相應的處理。可在catch塊中利用如下語句將異常資訊輸出到log日誌中。
getServletContext().log("ServletContext.log():異常資訊"+ex.toString());log("GenericServlet.log():異常資訊"+ex.toString());
這兩句話都可以將異常資訊記錄到log日誌中,他們的區別在於:如果調用GenericServlet類的log()方法,它會在日誌訊息前面加上servlet的名字,而調用ServletContext的log()方法,則只記錄訊息本身。
也可以使用response的sendError()方法將錯誤訊息發送到錯誤頁面。
利用RequestDispatcher來處理異常
之前介紹過頁面轉寄機制,所以也可以將異常封裝到一個請求中,然後利用ServletContext.log()轉寄一個異常處理servlet進行統一的處理。
轉載請註明出處:http://blog.csdn.net/iAm333