在开发中,会产生很多异常。我们通常采取如下方式统一处理异常
开发中会有很多控制器,如果每一个控制器层都处理异常就比较麻烦,我们可以统一处理异常。
我们先看默认不处理异常会发生什么?
@RequestMapping("test1")public void test1(){throw new RuntimeException("这里遇到了问题哈哈哈");}

这种提示是很不友善的、页面也很丑。我们通常是自己写异常处理页面,当发生异常后转发到自定义的异常页面。
SpringMVC提供了很多处理异常的方式。
使用SimpleMappingExceptionResolver
�使用springMVC自带的异常处理类,只需在把SimpleMappingExceptionResolver放在IOC容器中即可
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><!-- key为异常类型,值为要跳转到的页面--><prop key="java.lang.RuntimeException">/WEB-INF/error/runtimeException.jsp</prop><prop key="java.io.IOException">/WEB-INF/xxx.jsp</prop></props></property><!-- 异常对象的属性名称,可以在JSP中通过ex获取异常信息--><property name="exceptionAttribute" value="ex"/><!-- 其他异常统一跳转的页面--><property name="defaultErrorView" value="/WEB-INF/error/defaultError.jsp" /></bean>
自定义异常处理类,实现HandlerExceptionResolver接口
@Componentpublic class MyExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o,Exception e) {// 可以哪到异常的具体信息,比如哪个控制器的哪个方法抛出的异常// HandlerMethod handlerMethod = (HandlerMethod) o;// handlerMethod.getMethod();ModelAndView modelAndView = new ModelAndView("/WEB-INF/error/defaultError.jsp");modelAndView.addObject("ex",e);modelAndView.addObject("name","lifufa");return modelAndView;}}
这种方式比较灵活,可以根据异常的具体类型进行处理,也可以存放很多参数带到异常页面。
使用注解@ExceptionHandler
这种方式比较有局限性,只能处理一个Controller里面的异常,不常用。
所在的控制器里面的所有的异常统一处理
@ExceptionHandlerpublic ModelAndView error(Exception e){ModelAndView modelAndView = new ModelAndView("/WEB-INF/error/defaultError.jsp");modelAndView.addObject("ex",e);modelAndView.addObject("name","lifufa");return modelAndView;}
也可以指定处理的异常类型
@ExceptionHandler({RuntimeException.class, IOException.class})public ModelAndView error1(Exception e){ModelAndView modelAndView = new ModelAndView("/WEB-INF/error/defaultError.jsp");modelAndView.addObject("ex",e);modelAndView.addObject("name","lff");return modelAndView;}
使用@ControllerAdvice 和 @ExceptionHandler配合使用的方式
//@ControllerAdvice(basePackages = "com.lff") //表示这个包下面的所有异常都可以处理//@ControllerAdvice(annotations = Controller.class) //表示只要带有Controller注解抛出的异常都处理@ControllerAdvicepublic class MyExceptionResolverAnn {@ExceptionHandlerpublic ModelAndView error(Exception e){ModelAndView modelAndView = new ModelAndView("/WEB-INF/error/defaultError.jsp");modelAndView.addObject("ex",e);modelAndView.addObject("name","lifufa");return modelAndView;}// @ExceptionHandler({RuntimeException.class, IOException.class})// public ModelAndView error1(Exception e){// ModelAndView modelAndView = new ModelAndView("/WEB-INF/error/defaultError.jsp");// modelAndView.addObject("ex",e);// modelAndView.addObject("name","lff");// return modelAndView;// }}
这种方式也比较灵活常用。
