Spring MVC中异常处理的三种方式
前言
在SpringMVC,SpringBoot处理web请求时,若遇到错误或者异常,返回给用户一个良好的错误信息比WhitelabelErrorPage好的多。SpringMVC提供了三种异常处理方式,良好的运用它们可以给用户提供可读的错误信息。
1.实现HandlerExceptionResolver
publicclassAppHandlerExceptionResolverimplementsHandlerExceptionResolver{ @Override publicModelAndViewresolveException(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){ ModelAndViewmav=newModelAndView(); mav.addObject("message",ex.getMessage()); //可以设置视图名导向错误页面 mav.setViewName("/error"); //直接返回视图 //如果返回null,则会调用下一个HandlerExceptionResolver returnmav; } }
然后配置一个HandlerExceptionResolver
@Bean publicAppHandlerExceptionResolverappHandlerExceptionResolver(){ returnnewAppHandlerExceptionResolver(); }
HandlerExceptionResolver的实现类会catch到@Controller方法执行时发生的异常,处理后返回ModelAndView作为结果视图,因此可以通过它来定制异常视图。
HandlerExceptionResolver只能捕获@Controller层发生的异常(包括@Controller调用@Service发生的异常),其他地方的异常,比如访问了一个不存在的路径,不会被HandlerExceptionResolver捕获,此时会跳到ErrorController处理,下面会说到。
2.通过@ControllerAdvice和@ExceptionHandler注解
//可以配置拦截指定的类或者包等 //@RestControllerAdvice使@ExceptionHandler注解的方法默认具有@ResponseBody注解 @RestControllerAdvice(basePackageClasses=HelloWorldController.class) publicclassAppExceptionHandlerAdvice{ //配置拦截的错误类型 //这里也可以返回ModelAndView导向错误视图 @ExceptionHandler(Exception.class) publicResponseEntity
这种方式配置的异常处理由HandlerExceptionResolver的默认实现类HandlerExceptionResolverComposite处理,因此也只能捕获@Controller层的异常。
@ExceptionHandler可以返回ModelAndView定制异常视图。
@ControllerAdvice可以拦截特定的类,@ExceptionHandler可以拦截特定的异常,因此可以更精确的配置异常处理逻辑。
@ExceptionHandler可以在@Controller类中声明,此时只能处理同一个类的异常
3.自定义ErrorControllerbean
@RestController @RequestMapping("/error") publicclassAppErrorControllerextendsAbstractErrorController{ publicAppErrorController(ErrorAttributeserrorAttributes){ super(errorAttributes); } @RequestMapping publicResponseEntity
如果没有配置ErrorController,SpringBoot会通过ErrorMvcAutoConfiguration自动配置一个,默认的实现类为BasicErrorController。
ErrorController可以处理非@Controller层抛出的异常,例如常见的访问了一个不存在的路径。
ErrorController可以进行统一的错误处理,即让HandlerExceptionResolver返回的ModelAndView导向错误页面。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。