异常处理的思路
在学习框架之前,我们是如何处理异常的呢?try-catch
。
这样做有两个缺点:其一是try
模块之中写的往往是业务逻辑代码,业务处理与异常处理耦合在了一起;其二是catch
模块之中写的往往是打印异常信息,用户看到这些信息体验极差。
而SpringMVC框架巧妙对其进行了解耦:
Dao层、Service层、Controller层中出现了异常,我们毫不犹豫地一层一层向上抛,最终异常被抛到前端控制器(DispatcherServlet),其调用异常处理器(ExceptionResolver)进行统一的处理。
异常处理的两种实现
① 使用SpringMVC框架提供的简单异常处理器SimpleMappingExceptionResolver
② 使用自己手写的自定义异常处理器并实现HandlerExceptionResolver接口
简单映射异常处理器(框架提供)
对于每一种异常,对应跳转到一种错误视图。一切都是为了让用户看到的页面更友好。
<!-- 配置简单映射异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 默认错误页面 -->
<property name="defaultErrorView" value="error_0.jsp" />
<!-- 各种异常及其对应错误视图 -->
<property name="exceptionMappings">
<map>
<entry key="java.lang.NullPointerException" value="error_1.jsp" />
<entry key="java.lang.RuntimeException" value="error_2.jsp" />
<entry key="java.io.IOException" value="error_3.jsp" />
<entry key="java.io.FileNotFoundException" value="error_4.jsp" />
<entry key="java.sql.SQLException" value="error_5.jsp" />
<!-- More kinds of Exceptions... -->
</map>
</property>
</bean>
自定义映射异常处理器(自己手写)
对于每一种异常,不仅可以对应跳转到一种错误视图,还能附加上一些信息。
手写实现HandlerExceptionResolver接口的异常处理器:
public class MyExceptionResolver implements HandlerExceptionResolver {
// 关键参数:异常对象Exception
// 返回值:跳转的错误视图信息ModelAndView
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if(e instanceof java.lang.NullPointerException) {
modelAndView.addObject("xxx", "xxxxxxx");
modelAndView.setViewName("error_1.jsp");
} else if(e instanceof java.lang.RuntimeException) {
modelAndView.addObject("xxx", "xxxxxxx");
modelAndView.setViewName("error_2.jsp");
} else if(e instanceof java.io.IOException) {
modelAndView.addObject("xxx", "xxxxxxx");
modelAndView.setViewName("error_3.jsp");
} else if(e instanceof java.io.FileNotFoundException) {
modelAndView.addObject("xxx", "xxxxxxx");
modelAndView.setViewName("error_4.jsp");
} else if(e instanceof java.sql.SQLException) {
modelAndView.addObject("xxx", "xxxxxxx");
modelAndView.setViewName("error_5.jsp");
} else {
modelAndView.addObject("xxx", "xxxxxxx");
modelAndView.setViewName("error_0.jsp");
}
return modelAndView;
}
}
然后告诉框架一声:
<!-- 配置自定义异常处理器 -->
<bean class="com.samarua.resolver.MyExceptionResolver" />