我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。这篇博文主要总结一下SpringMVC中如何统一处理异常。
其中实现的方法分别包括以下:
序号 | 实现方式 | 备注 |
---|---|---|
1 | 实现SimpleMapperExceptionResolver | 配置文件中配置 |
2 | 实现HandleExceptionResolver接口 | 配置实现装配bena |
3 | @ExceptionHandler注解 | 侵入式代理,不建议使用 |
装配SimpleMapperHandlerResolver对象
在spring-mvc的配置文件中,配置该对象即可,具体信息请 参考注释
<!--配置SpringMVC异常处理页面-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--当发生异常的时候,跳转到此URL-->
<property name="defaultErrorView" value="/error/default"/>
<!--传入的参数名称为ex-->
<property name="exceptionAttribute" value="ex"/>
<!--自定义异常页面-->
<!--根据发生的异常来分别处理-->
<property name="exceptionMappings">
<props>
<prop key="com.tao.spring.exception.DataValidateException">/error/datavalidate</prop>
</props>
</property>
</bean>
其中DataValidateException是自定义的异常类,其代码如下
public class DataValidateException extends RuntimeException {
private String message;
public DataValidateException(String message) {
super(message);
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
然后在Controller层或者Service层,以及DAO层来尝试抛出异常,可查看是否跳转到异常处理页面
实现HandlerExceptionResolver接口
实现此接口,需要实现相应的方法,在此代码中可以判断抛出的异常类型,来实现自定义异常处理,如下
public class CustomHandleExceptionResolver implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
if (ex instanceof DataValidateException) {
System.out.println("发生了自定义异常");
}
if (ex instanceof NullPointerException){
System.out.println("发生了空指针异常");
}
ModelAndView modelAndView=new ModelAndView();
return modelAndView;
}
}
使用@ExceptionHandler注解
首先写个BaseController类,并在类中使用@ExceptionHandler注解声明异常处理的方法,如:
public class BaseController {
@ExceptionHandler
public String exp(HttpServletRequest request, Exception ex) {
//TODO 异常处理
}
}
然后将所有需要异常处理的Controller都继承这个BaseController,虽然从执行来看,不需要配置什么东西,但是代码有侵入性,需要异常处理的Controller都要继承它才行。在以后的修改,远远不如使用配置文件来得方便。
网友评论