SpringMVC 異常處理機(jī)制與自定義異常處理方式
本節(jié)介紹SpringMVC的異常處理機(jī)制
首先介紹SpringMVC默認(rèn)提供了一些HTTP錯(cuò)誤類似碼的默認(rèn)異常處理
如何給一個(gè)Controller自定義異常處理
如何為項(xiàng)目做一個(gè)全局異常處理
提到異常處理,就不得不提HandlerExceptionResolvers,我們的DispatcherServlet默認(rèn)設(shè)置三個(gè)異常處理器:
AnnotationMethodHandlerExceptionResolver:通過注解@ExceptionHandler實(shí)現(xiàn)異常理出ResponseStatusExceptionResolver:通過注解@ResponseStatus處理HTTP請(qǐng)求的狀態(tài)碼異常DefaultHandlerExceptionResolver:處理Spring Exception并將其轉(zhuǎn)換為HTTP響應(yīng)狀態(tài)碼傳送的客戶端
SpringMVC默認(rèn)處理的幾種異常
| Exception | HTTP Status Code |
|---|---|
|
BindException |
400 (Bad Request) |
|
ConversionNotSupportedException |
500 (Internal Server Error) |
|
HttpMediaTypeNotAcceptableException |
406 (Not Acceptable) |
|
HttpMediaTypeNotSupportedException |
415 (Unsupported Media Type) |
|
HttpMessageNotReadableException |
400 (Bad Request) |
|
HttpMessageNotWritableException |
500 (Internal Server Error) |
|
HttpRequestMethodNotSupportedException |
405 (Method Not Allowed) |
|
MethodArgumentNotValidException |
400 (Bad Request) |
|
MissingServletRequestParameterException |
400 (Bad Request) |
|
MissingServletRequestPartException |
400 (Bad Request) |
|
NoHandlerFoundException |
404 (Not Found) |
|
NoSuchRequestHandlingMethodException |
404 (Not Found) |
|
TypeMismatchException |
400 (Bad Request) |
|
MissingPathVariableException |
500 (Internal Server Error) |
|
NoHandlerFoundException |
404 (Not Found) |
首先介紹的是注解@ResponseStatus
@ResponseStatus
用于自定義異常類上
該異常屬于某種HTTP錯(cuò)誤狀態(tài)碼異常(或者說交由其處理)
例如:我們自定義一個(gè)異常類:HttpStateCode404Exception,將其映射到404狀態(tài)碼
異常類:HttpStateCode404Exception.java
/**
*使用@ResponseStatus只能實(shí)現(xiàn)簡(jiǎn)單的提示
*當(dāng)程序中拋出HttpStateCode404Exception會(huì)使用提示語:頁面未找到
*/
@ResponseStatus(code=HttpStatus.NOT_FOUND,reason="頁面未找到")
public class HttpStateCode404Exception extends RuntimeException{
private static final long serialVersionUID = 1L;
}
然后我們?cè)谝粋€(gè)Controller類處理/handleException/存在在的映射路徑時(shí)的處理方法
@Controller
@RequestMapping("handleException")
public class HandleExceptionController {
/*@ExceptionHandler({Throwable.class})
public String handleThisController(){
return "/handleException/404";
}*/
@RequestMapping("{url}")
public void handle404(){
throw new HttpStateCode404Exception();
}
}
細(xì)心的讀者,一定會(huì)發(fā)現(xiàn),我在上面注掉的代碼使用了@ExceptionHandler注解
最終我們可以得到錯(cuò)誤頁面提示是這樣的:好丑,但是有我們的reason

此方式只能實(shí)現(xiàn)簡(jiǎn)單的信息提示。
再來看看@ExceptionHandler
打開上面被注釋掉的代碼,你會(huì)發(fā)現(xiàn)我們的錯(cuò)誤控制可以(轉(zhuǎn)發(fā))跳轉(zhuǎn)頁面了。
而且由于我們的這個(gè)方法定義在這個(gè)Controller類中,只要滿足此@ExceptionHandler定義的異常都會(huì)走這個(gè)方法。
注意:是這個(gè)Controller類中所有請(qǐng)求出現(xiàn)異常,且異常被其包含
我希望定義一個(gè)全局異常處理呢???@ControllerAdvice
為我們實(shí)現(xiàn)處理所以的控制器Controllers的異常
具體實(shí)現(xiàn)
/**
* 定義一個(gè)處理所有Controllers的ExceptionHandler
*/
@ControllerAdvice
public class GlobalExceptionAdvice {
@ExceptionHandler({HttpStateCode404Exception.class})
public String handleThisController(){
return "/handleException/404";
}
/*處理其他異常...*/
}
異常處理的順序
1.Controller處理時(shí)拋出異常
2.本Controller類中的@ExceptionHandler如果捕獲到,就執(zhí)行其處理方法
3.否則,由全局異常捕獲處理
4.否則,由@ResponseStatus注解的異常捕獲處理
5.最后DefaultHandlerExceptionResolver處理
這恰恰也就是DispatcherServlet異常處理器的配置順序(循序調(diào)用,List)
自定義異常類(SpringMVC的異常處理)
SpringMVC當(dāng)中的異常處理–自定義異常處理類
①:自定義異常類
public class CustomerException extends Exception {
//定義我們的異常信息
private String exceptMsg;
public CustomerException(String exceptMsg){
this.exceptMsg = exceptMsg;
}
public String getExceptMsg() {
return exceptMsg;
}
public void setExceptMsg(String exceptMsg) {
this.exceptMsg = exceptMsg;
}
}
②:自定義異常處理器
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.jws.WebParam.Mode;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class CustomerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {
//通過我們自定義異常處理器,繼承自HandlerExceptionResolver 來實(shí)現(xiàn)我們的異常處理
//自定義我們的異常信息
String msg = "";
//通過ModelAndView 來實(shí)現(xiàn)跳轉(zhuǎn)到我們的錯(cuò)誤頁面,并且將錯(cuò)誤信息帶回到頁面進(jìn)行顯示
ModelAndView view = new ModelAndView();
view.setViewName("error");
//取出我們自定義的異常信息
if(ex instanceof CustomerException){
CustomerException exception = (CustomerException) ex;
msg = exception.getExceptMsg();
}else{
//獲取我們的stringWriter來獲取我們的異常信息
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
//通過ex.printStackTrace(printWriter);來向我們的printWriter當(dāng)中輸入異常信息
ex.printStackTrace(printWriter);
msg = writer.toString();
}
//獲取到異常信息之后,通過短信,郵件等技術(shù),通知相關(guān)人員
view.addObject("msg", msg);
return view;
}
}
③:配置我們的異常處理器
<!-- 申明我們的異常解析處理類--> <bean id="customerExceptionResolver" class="cn.itcast.springmvc.exception.CustomerExceptionResolver"></bean>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Idea Project文件目錄不見了,只剩External Libraries和imi文件的解決
這篇文章主要介紹了Idea Project文件目錄不見了,只剩External Libraries和imi文件的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
詳解java實(shí)現(xiàn)HTTP請(qǐng)求的三種方式
這篇文章主要介紹了java實(shí)現(xiàn)HTTP請(qǐng)求的三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Java的Struts框架中的if/else標(biāo)簽使用詳解
這篇文章主要介紹了Java的Struts框架中的if/else標(biāo)簽使用詳解,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
java 數(shù)據(jù)結(jié)構(gòu)并查集詳解
并查集是一種用來管理元素分組情況的數(shù)據(jù)結(jié)構(gòu)。并查集可以高效地進(jìn)行如下操作。本文將通過Java實(shí)現(xiàn)并查集,感興趣的小伙伴可以了解一下2022-03-03
Eclipse中查看android工程代碼出現(xiàn)"android.jar has no source attachment
這篇文章主要介紹了Eclipse中查看android工程代碼出現(xiàn)"android.jar has no source attachment"的解決方案,需要的朋友可以參考下2016-05-05
javaWeb連接數(shù)據(jù)庫實(shí)現(xiàn)簡(jiǎn)單登陸注冊(cè)功能的全過程
初學(xué)javaWeb,老師留下一小作業(yè),用JAVA實(shí)現(xiàn)與服務(wù)器端交互,實(shí)現(xiàn)登錄和注冊(cè)功能,下面這篇文章主要給大家介紹了關(guān)于javaWeb連接數(shù)據(jù)庫實(shí)現(xiàn)簡(jiǎn)單登陸注冊(cè)功能的相關(guān)資料,需要的朋友可以參考下2022-06-06

