在实际的开发中,不管做什么操作,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。如果能够做到统一的处理,将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。Spring MVC就提供了一套异常处理机制。
Spring MVC的异常处理有多种方式,常用的有基于注解@ExceptionHandler,基于异常处理器SimpleMappingExceptionResolver。
首先自定义一个异常类SpringException,继承RumtimeException类,并实现其四个构造方法,代码略。
然后在控制器中编写方法,并为方法加入注解@ExceptionHandler,代码如下。
@ExceptionHandler(value={SpringException.class})
public String handlerException(SpringException e, Model model) {
model.addAttribute("e", e);
return "error";
}
注解中参数value的值使用的是一个数组,也就是说其中可以同时处理多个异常。此时如果该控制器中的任何操作发生了SpringException异常,都会被该方法捕获,进而做统一的处理。在返回的视图页面中只需要使用EL表达式${e.message },就可以显示异常信息。
但是这种操作只能处理一个控制器中的相关异常信息,是一种局部的操作,如果想要实现全局的异常处理操作,可以创建一个异常处理类,通过注解@ControllerAdvice就可以实现全局的异常处理了,代码如下。
@ControllerAdvice
public class SpringExceptionHandler {
@ExceptionHandler(value={SpringException.class})
public String handlerException(SpringException e, Model model) {
model.addAttribute("e", e);
return "error";
}
}
Spring MVC还提供了一种全局异常的处理方式,就是基于异常处理器SimpleMappingExceptionResolver的异常处理。具体操作是,只需要在Spring MVC的配置文件中添加配置即可,具体代码如下。
<!-- 全局异常处理 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.tuwei.exception.SpringException">error</prop>
</props>
</property>
</bean>
其中的<property>标签中的name属性值“exceptionMappings”,其实是SimpleMappingExceptionResolver类中的一个属性。此时返回的错误页面也是error.jsp,在页面中显示错误信息,应该使用EL表达式${exception.message }。