您好,登錄后才能下訂單哦!
這篇文章主要介紹SpringMVC異常處理機(jī)制與自定義異常處理方式的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
提到異常處理,就不得不提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)碼傳送的客戶端
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
用于自定義異常類上
該異常屬于某種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當(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>
以上是“SpringMVC異常處理機(jī)制與自定義異常處理方式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。