在开发中,会产生很多异常。我们通常采取如下方式统一处理异常
开发中会有很多控制器,如果每一个控制器层都处理异常就比较麻烦,我们可以统一处理异常。
我们先看默认不处理异常会发生什么?
@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接口
@Component
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public 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里面的异常,不常用。
所在的控制器里面的所有的异常统一处理
@ExceptionHandler
public 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注解抛出的异常都处理
@ControllerAdvice
public class MyExceptionResolverAnn {
@ExceptionHandler
public 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;
// }
}
这种方式也比较灵活常用。