1. 異常解析類(lèi):
如果在請(qǐng)求映射或請(qǐng)求處理過(guò)程中發(fā)生了異常, DispatcherServlet
會(huì)將其委托給HandlerExceptionResolver
bean鏈來(lái)處理異常.
常見(jiàn)的HandlerExceptionResolver
實(shí)現(xiàn)如下:
HandlerExceptionResolver | 說(shuō)明 |
---|---|
SimpleMappingExceptionResolver |
異常類(lèi)名稱(chēng)與錯(cuò)誤視圖頁(yè)面之間的映射 |
DefaultHandlerExceptionResolver |
spring mvc拋出的異常與HTTP狀態(tài)碼之間的映射的默認(rèn)定義 |
ResponseStatusExceptionResolver |
根據(jù)@ResponseStatus注解的值匹配異常到相應(yīng)的HTTP狀態(tài)碼 |
ExceptionHandlerExceptionResolver |
通過(guò)調(diào)用@Controller或@ControllerAdvice類(lèi)中的@ExceptionHandler注解方法來(lái)解析異常. |
2. 配置異常
2.1 異常與HTTP狀態(tài)碼之間映射
使用@ResponseStatus
注解. 注解應(yīng)用在異常類(lèi)上.其屬性有:
- code: 定義Http狀態(tài)碼
- reason: 異常說(shuō)明
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "user not found")
public class UserNotFoundException extends RuntimeException {
private static final long serialVersionUID = 1L;
}
2.2 @ExceptionHandler注解
定義異常處理方法并加上@ExceptionHandler
注解, 方法可以定義在@Controller
類(lèi)或@ControllerAdvice
類(lèi)中:
- 如果定義在
@Controller
類(lèi)中, 則這個(gè)方法可以處理這個(gè)類(lèi)中的所有@RequestMapping
注解方法拋出的對(duì)應(yīng)異常. - 如果定義在
@ControllerAdvice
類(lèi)中, 則可以處理所有的@Controller
類(lèi)中的@RequestMapping
注解方法拋出的對(duì)應(yīng)異常.
異常方法的定義同@RequestMapping
方法. 可以通過(guò)參數(shù)定義處理的異常類(lèi)型(這只能定義一個(gè)類(lèi)別), 也可以在注解中指定(可以指定多個(gè), 然后定義一個(gè)它們的父類(lèi)型作為參數(shù)來(lái)接收它們的信息).
@ExceptionHandler({IOException.class, UserNotFoundException.class})
public String handlerException(Exception e) {
System.out.println(e.getMessage());
return "error";
}
2.3 HTTP錯(cuò)誤狀態(tài)碼與錯(cuò)誤頁(yè)面之間的映射
在web.xml
中定義<error-page>
元素, 指定狀態(tài)碼和頁(yè)面路徑.
<error-page>
<error-code>500</error-code>
<location>/view/500</location>
</error-page>
<!--對(duì)于未定義的狀態(tài)碼將統(tǒng)一跳轉(zhuǎn)到這個(gè)頁(yè)面-->
<error-page>
<location>/error</location>
</error-page>
注1:在<error-page>
元素中還存在一個(gè)<exception-type>
子元素, 這是用來(lái)定義異常類(lèi)型(指定異常類(lèi)型)與錯(cuò)誤頁(yè)面之間的映射.
注2:暫不支持Java配置異常頁(yè)面映射.