1、异常处理思路
在 Java 中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
如下图所示,系统的 dao 层、service 层还是 controller 层出现异常都通过throws Exception向上抛出,最后由 SpringMVC 前端控制器交由异常处理器进行异常处理。SpringMVC 提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。在了解了 SpringMVC 中的异常处理机制,下面就开始分析 SpringMVC 中的异常处理。
2、解决异常的两种思路
2.1、使用 SpringMVC 自带的简单异常处理器
SpringMVC 中自带了一个异常处理器叫SimpleMappingExceptionResolver
,该处理器实现了HandlerExceptionResolver
接口,全局异常处理器都需要实现该接口。我们要要使用这个自带的异常处理器,只需要在 springmvc.xml
文件中配置该处理器:
<!-- springmvc提供的简单异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面 -->
<property name="defaultErrorView" value="/WEB-INF/jsp/error.jsp"/>
<!-- 定义异常处理页面用来获取异常信息的变量名,也可以不定义,默认名为exception -->
<property name="exceptionAttribute" value="ex"/>
<!-- 定义需要特殊处理的异常,这是重要点 -->
<property name="exceptionMappings">
<map>
<!-- key 中表示异常类型 value 表示错误视图页面 -->
<entry key="java.lang.ClassCastException" value="error"/>
<!-- 还可以定义其他的自定义异常 -->
</map>
</property>
</bean>
这个异常处理就完成,在出现异常后,首选会在exceptionMappings
中寻找是否有配置对应的异常处理,如果有则执行,如果没有则执行defaultErrorView
默认的异常处理页面。
2.2 自定义异常处理器
自定义一个异常处理器需要实现 HandlerExceptionResolver
接口,然后再配置文件中配置自定义异常处理器。
- 创建异常处理器类实现HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //向前台返回错误信息 ModelAndView modelAndView = new ModelAndView(); //如果抛出的是 类型转换异常则执行 if(ex instanceof ClassCastException) { modelAndView.addObject("info", "类型转换异常"); } else { //如果抛出的不是类型转换异常则表示为其他异常 modelAndView.addObject("info", "其他异常"); } modelAndView.setViewName("error"); return modelAndView; } }
- 配置自定义异常处理器
<bean id="exceptionResolver" class="MyExceptionResolver"/>
当然上述异常处理只是为了演示其用法,在具体开发中不会显示类型转换异常等信息。