SpringMVC 異常處理機(jī)制與自定義異常處理方式
本節(jié)介紹SpringMVC的異常處理機(jī)制
首先介紹SpringMVC默認(rèn)提供了一些HTTP錯(cuò)誤類似碼的默認(rèn)異常處理
如何給一個(gè)Controller自定義異常處理
如何為項(xiàng)目做一個(gè)全局異常處理
提到異常處理,就不得不提HandlerExceptionResolvers,我們的DispatcherServlet默認(rèn)設(shè)置三個(gè)異常處理器:
AnnotationMethodHandlerExceptionResolver
:通過(guò)注解@ExceptionHandler實(shí)現(xiàn)異常理出ResponseStatusExceptionResolver
:通過(guò)注解@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)碼異常(或者說(shuō)交由其處理)
例如:我們自定義一個(gè)異常類:HttpStateCode404Exception,將其映射到404狀態(tài)碼
異常類:HttpStateCode404Exception.java
/** *使用@ResponseStatus只能實(shí)現(xiàn)簡(jiǎn)單的提示 *當(dāng)程序中拋出HttpStateCode404Exception會(huì)使用提示語(yǔ):頁(yè)面未找到 */ @ResponseStatus(code=HttpStatus.NOT_FOUND,reason="頁(yè)面未找到") 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ò)誤頁(yè)面提示是這樣的:好丑,但是有我們的reason
此方式只能實(shí)現(xiàn)簡(jiǎn)單的信息提示。
再來(lái)看看@ExceptionHandler
打開上面被注釋掉的代碼,你會(huì)發(fā)現(xiàn)我們的錯(cuò)誤控制可以(轉(zhuǎn)發(fā))跳轉(zhuǎn)頁(yè)面了。
而且由于我們的這個(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) { //通過(guò)我們自定義異常處理器,繼承自HandlerExceptionResolver 來(lái)實(shí)現(xiàn)我們的異常處理 //自定義我們的異常信息 String msg = ""; //通過(guò)ModelAndView 來(lái)實(shí)現(xiàn)跳轉(zhuǎn)到我們的錯(cuò)誤頁(yè)面,并且將錯(cuò)誤信息帶回到頁(yè)面進(jìn)行顯示 ModelAndView view = new ModelAndView(); view.setViewName("error"); //取出我們自定義的異常信息 if(ex instanceof CustomerException){ CustomerException exception = (CustomerException) ex; msg = exception.getExceptMsg(); }else{ //獲取我們的stringWriter來(lái)獲取我們的異常信息 StringWriter writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); //通過(guò)ex.printStackTrace(printWriter);來(lái)向我們的printWriter當(dāng)中輸入異常信息 ex.printStackTrace(printWriter); msg = writer.toString(); } //獲取到異常信息之后,通過(guò)短信,郵件等技術(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)文章
java讀取Excel導(dǎo)入去除空行簡(jiǎn)單方法
這篇文章主要給大家介紹了關(guān)于java讀取Excel導(dǎo)入去除空行的簡(jiǎn)單方法,在日常開發(fā)中,想必都遇到過(guò)批處理的需求,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下2023-07-07Apache Shrio安全框架實(shí)現(xiàn)原理及實(shí)例詳解
這篇文章主要介紹了Apache Shrio安全框架實(shí)現(xiàn)原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringCloud gateway如何修改返回?cái)?shù)據(jù)
這篇文章主要介紹了SpringCloud gateway如何修改返回?cái)?shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06關(guān)于bootstrap.yml和bootstrap.properties的優(yōu)先級(jí)問(wèn)題
這篇文章主要介紹了關(guān)于bootstrap.yml和bootstrap.properties的優(yōu)先級(jí)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java遞歸基礎(chǔ)與遞歸的宏觀語(yǔ)意實(shí)例分析
這篇文章主要介紹了Java遞歸基礎(chǔ)與遞歸的宏觀語(yǔ)意,結(jié)合實(shí)例形式分析了java遞歸的相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03Java基礎(chǔ)知識(shí)精通二維數(shù)組的應(yīng)用
為了方便組織各種信息,計(jì)算機(jī)常將信息以表的形式進(jìn)行組織,然后再以行和列的形式呈現(xiàn)出來(lái)。二維數(shù)組的結(jié)構(gòu)決定了其能非常方便地表示計(jì)算機(jī)中的表,以第一個(gè)下標(biāo)表示元素所在的行,第二個(gè)下標(biāo)表示元素所在的列。下面簡(jiǎn)單了解一下二維數(shù)組,包括數(shù)組的聲明和初始化2022-04-04學(xué)習(xí)JVM之java內(nèi)存區(qū)域與異常
關(guān)于JVM內(nèi)存區(qū)域的知識(shí)對(duì)于初學(xué)者來(lái)說(shuō)其實(shí)是很重要的,了解Java內(nèi)存分配的原理,這對(duì)于以后JAVA的學(xué)習(xí)會(huì)有更深刻的理解。下面來(lái)看看詳細(xì)介紹。2016-07-07Java詳細(xì)分析sleep和wait方法有哪些區(qū)別
這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無(wú)參區(qū)別),通過(guò)代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下2022-04-04