这篇文章主要介绍SpringMVC异常处理机制与自定义异常处理方式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
提到异常处理,就不得不提HandlerExceptionResolvers,我们的DispatcherServlet默认设置三个异常处理器:
AnnotationMethodHandlerExceptionResolver
:通过注解@ExceptionHandler实现异常理出
ResponseStatusExceptionResolver
:通过注解@ResponseStatus处理HTTP请求的状态码异常
DefaultHandlerExceptionResolver
:处理Spring Exception并将其转换为HTTP响应状态码传送的客户端
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错误状态码异常(或者说交由其处理)
例如:我们自定义一个异常类:HttpStateCode404Exception,将其映射到404状态码
异常类:HttpStateCode404Exception.java
/** *使用@ResponseStatus只能实现简单的提示 *当程序中抛出HttpStateCode404Exception会使用提示语:页面未找到 */ @ResponseStatus(code=HttpStatus.NOT_FOUND,reason="页面未找到") public class HttpStateCode404Exception extends RuntimeException{ private static final long serialVersionUID = 1L; }
然后我们在一个Controller类处理/handleException/存在在的映射路径时的处理方法
@Controller @RequestMapping("handleException") public class HandleExceptionController { /*@ExceptionHandler({Throwable.class}) public String handleThisController(){ return "/handleException/404"; }*/ @RequestMapping("{url}") public void handle404(){ throw new HttpStateCode404Exception(); } }
细心的读者,一定会发现,我在上面注掉的代码使用了@ExceptionHandler注解
最终我们可以得到错误页面提示是这样的:好丑,但是有我们的reason
此方式只能实现简单的信息提示。
再来看看@ExceptionHandler
打开上面被注释掉的代码,你会发现我们的错误控制可以(转发)跳转页面了。
而且由于我们的这个方法定义在这个Controller类中,只要满足此@ExceptionHandler定义的异常都会走这个方法。
注意:是这个Controller类中所有请求出现异常,且异常被其包含
我希望定义一个全局异常处理呢???@ControllerAdvice
为我们实现处理所以的控制器Controllers的异常
具体实现
/** * 定义一个处理所有Controllers的ExceptionHandler */ @ControllerAdvice public class GlobalExceptionAdvice { @ExceptionHandler({HttpStateCode404Exception.class}) public String handleThisController(){ return "/handleException/404"; } /*处理其他异常...*/ }
1.Controller处理时抛出异常
2.本Controller类中的@ExceptionHandler如果捕获到,就执行其处理方法
3.否则,由全局异常捕获处理
4.否则,由@ResponseStatus注解的异常捕获处理
5.最后DefaultHandlerExceptionResolver处理
这恰恰也就是DispatcherServlet异常处理器的配置顺序(循序调用,List)
SpringMVC当中的异常处理–自定义异常处理类
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 来实现我们的异常处理 //自定义我们的异常信息 String msg = ""; //通过ModelAndView 来实现跳转到我们的错误页面,并且将错误信息带回到页面进行显示 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当中输入异常信息 ex.printStackTrace(printWriter); msg = writer.toString(); } //获取到异常信息之后,通过短信,邮件等技术,通知相关人员 view.addObject("msg", msg); return view; } }
<!-- 申明我们的异常解析处理类--> <bean id="customerExceptionResolver" class="cn.itcast.springmvc.exception.CustomerExceptionResolver"></bean>
以上是“SpringMVC异常处理机制与自定义异常处理方式的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。