異常處理、拋出異常
一、異常處理機制
Java 應用程序中,異常處理機制為:拋出異常,捕捉異常。
拋出異常:當一個方法出現錯誤引發異常時,方法創建異常對象並交付運行時系統,異常對象中包含了異常類型和異常出現時的程序狀態等異常信息。運行時系統負責尋找處置異常的代碼並執行。
捕獲異常:在方法拋出異常之後,運行時系統將轉為尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發生時依次存留在調用棧中的方法的集合。當異常處理器所能處理的異常類型與方法拋出的異常類型相符時,即為合適 的異常處理器。運行時系統從發生異常的方法開始,依次回查調用棧中的方法,直至找到含有合適異常處理器的方法並執行。當運行時系統遍歷調用棧而未找到合適 的異常處理器,則運行時系統終止。同時,意味著
二、捕獲異常try...catch...finally..
try {
// 可能會發生異常的程序代碼
} catch (xxxException e1 {
// 捕獲並處理try拋出的異常類型Type1
} catch (xxxException e2) {
// 捕獲並處理try拋出的異常類型Type2
}
.....
finally {
// 無論是否發生異常,都將執行的語句塊
}
綜上所述:
try :該代碼塊中編寫可能產生異常的代碼。
catch :用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
finally :有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。
finally語句塊將在方法返回之前被執行。在以下4種特殊情況下,finally塊不會被執行:
1)在finally語句塊中發生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關閉CPU。
三、異常處理
1.異常處理器(自定義異常)
springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。
1)異常處理思路
系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。
系統的dao、service、controller出現都通過throws Exception向上拋出,最後由springmvc前端控制器DispacherServlet交由異常處理器進行異常處理,如下圖
2) 自定義異常類
使用步驟:
1、定義異常類,繼承Exception,或者繼承RuntimeException
2、重寫構造方法,在構造方法中,super將異常信息,傳遞給父類
3、通過throw異常對象,使用該異常。
為了區別不同的異常通常根據異常類型自定義異常類,這裏我們創建一個自定義系統異常,如果controller、service、dao拋出此類異常說明是系統預期處理的異常信息。
/** * 創建一個自定義異常類,它繼承了Exception,可以捕獲所有異常信息。 * @author admin */ public class CustomException extends Exception { // 定義變量,存儲異常信息 private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } // 創建構造方法 public CustomException(String message){ super(message); this.message = message; } }
3)自定義異常處理器
1)自定義異常類:繼承Exception類,定義異常信息;
2)自定義異常處理器:
實現接口HandlerExceptionResolver;
重寫resolveException方法();
判斷拋出異常是否為自定義異常;如果是,直接異常轉換;否則,重構系統錯誤常;
創建視圖解析器,保存異常信息,返回頁面;
3)在springmvc.xml文件中配置自定義異常處理器交由srpingmvc管理;
4)編寫一個異常信息展示頁面;
public class CustomExceptionResoler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { String msg = null; // 定義 自定義異常類 CustomException customException = null; // 判斷拋出異常是否為自定義異常 if (ex instanceof CustomException) { // 是,直接異常轉換:獲取異常展示到頁面 customException = (CustomException) ex; msg = customException.getMessage(); } else { // 否,重新構造一個系統錯誤的異常 customException = new CustomException("系統錯誤,請與管理員聯系!"); ex.printStackTrace(); // 想控制臺打印異常信息; StringWriter s = new StringWriter(); PrintWriter printWriter = new PrintWriter(s); ex.printStackTrace(printWriter); msg = s.toString(); } // 執行操作 寫日誌、發短信、發郵件... // 創建視圖解析器對象 ModelAndView modelAndView = new ModelAndView(); // 存儲異常信息 modelAndView.addObject("message", msg); modelAndView.setViewName("error"); // 將異常信息返回 return modelAndView; } }
4)錯誤信心展示頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>錯誤頁面</title> </head> <body> 您的操作出現錯誤如下: <br /> ${message } </body> </html>
5)異常處理器的配置
在springmvc.xml中引入自定義異常處理器的bean:
<!-- 自定義全局異常處理器 -->
<bean id="handlerExceptionResolver" class="cn.ssm.mycustom.exceptionResolver.CustomExceptionResolver"/>
2.配置web.xml的方式處理異常
在web.xml文件中配置:
<!-- 第二種方式:配置處理異常 -->
<error-page> <!-- 404異常 --> <error-code>404</error-code> <!-- 異常展示頁面 --> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page>
其中,404.jsp和500.jsp是自定義異常提示頁面。
異常處理、拋出異常