1. 程式人生 > >異常處理、拋出異常

異常處理、拋出異常

依次 管理員 images 視圖 obj 聯系 運行時異常 nco 獲取

一、異常處理機制

Java 應用程序中,異常處理機制為:拋出異常,捕捉異常。

拋出異常當一個方法出現錯誤引發異常時,方法創建異常對象並交付運行時系統,異常對象中包含了異常類型和異常出現時的程序狀態等異常信息。運行時系統負責尋找處置異常的代碼並執行。

捕獲異常:在方法拋出異常之後,運行時系統將轉為尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發生時依次存留在調用棧中的方法的集合。當異常處理器所能處理的異常類型與方法拋出的異常類型相符時,即為合適 的異常處理器。運行時系統從發生異常的方法開始,依次回查調用棧中的方法,直至找到含有合適異常處理器的方法並執行。當運行時系統遍歷調用棧而未找到合適 的異常處理器,則運行時系統終止。同時,意味著

Java程序的終止。

二、捕獲異常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,前者通過捕獲異常從而獲取異常信息,後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。

系統的daoservicecontroller出現都通過throws Exception向上拋出,最後由springmvc前端控制器DispacherServlet交由異常處理器進行異常處理,如下圖

技術分享

2) 自定義異常類

使用步驟:

1、定義異常類,繼承Exception,或者繼承RuntimeException

2、重寫構造方法,在構造方法中,super將異常信息,傳遞給父類

3、通過throw異常對象,使用該異常。

為了區別不同的異常通常根據異常類型自定義異常類,這裏我們創建一個自定義系統異常,如果controllerservicedao拋出此類異常說明是系統預期處理的異常信息。

/**

 * 創建一個自定義異常類,它繼承了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.jsp500.jsp是自定義異常提示頁面。

技術分享

異常處理、拋出異常