文章目录
- 1.异常处理的思路
- 2.异常处理器实现方式
- 2.1简单异常处理器SimpleMappingExceptionResolver
- 2.2自定义异常处理器
1.异常处理的思路
系统中异常包括两类:
- 预期异常,通过捕获异常从而获取异常信息。
- 运行时异常RuntimeException,通过规范代码开发、测试等手段减少运行时异常的发生。
使用SpringMVC处理异常的思路就是:系统的Dao、Service、Controller出现的异常都通过throws Exception一层一层向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
平时开发中我们喜欢通过try…catch来处理异常,但是这样的话代码量会蹭蹭往上涨。而使用SpringMVC的话,我们只需将异常使用Thorws关键字抛出,最终交由异常处理器处理。
2.异常处理器实现方式
我们有两种实现方式,可以按业务需求进行选择。
- 使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver
- 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器
2.1简单异常处理器SimpleMappingExceptionResolver
SpringMVC已经定义好了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置
首先人为制造五种异常:
@Controller
public class ExceptionTest {
@RequestMapping("/run1")
public void run1() {
System.out.println("抛出类型转换异常....");
Object str = "zhangsan";
Integer num = (Integer)str;
}
@RequestMapping("/run2")
public void run2() {
System.out.println("抛出除零异常....");
int i = 1/0;
}
@RequestMapping("/run3")
public void run3() throws FileNotFoundException {
System.out.println("文件找不到异常....");
InputStream in = new FileInputStream("C:/xxx/xxx/xxx.txt");
}
@RequestMapping("/run4")
public void run4() {
System.out.println("空指针异常.....");
String str = null;
str.length();
}
@RequestMapping("/run5")
public void run5() throws MyException {
System.out.println("自定义异常....");
throw new MyException();
}
}
创建一个自定义异常
public class MyException extends Exception {
}
配置简单映射异常处理器
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"></property>
<property name="exceptionMappings">
<map>
<entry key="java.lang.NullPointerException" value="null"></entry>
<entry key="venture.study.exception.MyException" value="mye"></entry>
</map>
</property>
</bean>
这里空指针异常和自定义异常分别会跳转到null视图与mye视图,也即null.jsp和mye.jsp。其他异常会跳转到error视图
我们访问/run1,/run2,/run3,跳转到默认异常视图页面,输出结果如下:
我们访问/run4,输出结果如下:
我们访问/run5,输出结果如下:
2.2自定义异常处理器
自定义异常处理器需要实现HandlerExceptionResolver接口
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
//处理异常的代码实现
//创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("exceptionPage");
return modelAndView;
}
}
<!--配置自定义异常处理器-->
<bean class="venture.study.exception.MyExceptionResolver"></bean>
再次访问/run1,跳转到exceptionPage视图
其实,简单异常处理器其实在日常开发中已经够用了,只要在配置文件中配置对应异常的视图就可以对我们遇到的运行时异常进行转发处理。