1.异常处理思路
系统中异常包括两类:自定义异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws new Exception()向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:
springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
2.自定义异常类
对不同的异常类型定义异常类,继承Exception。
3.全局异常处理器
思路:
系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。
全局异常处理器处理思路:
首先解析出异常类型;
如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示
如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
springmvc提供一个HandlerExceptionResolver接口, 全局异常处理器实现此接口
4.错误页面 error.jsp
5.配置全局异常处理器
XML版本 - 在dispatcher-servlet.xml中配置全局异常处理器
JavaConfig配置类版本 - 在SpringMVCConfig配置类中配置全局异常处理器
//全局异常处理器
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { resolvers.add(new CustomHandlerExceptionResolver());
}
6.异常测试
在controller、service、dao中任意一处需要手动抛出异常(抛出自定义异常)。
1).如果是程序中手动抛出的异常,在错误页面中显示自定义的异常信息
2).如果不是手动抛出异常说明是一个运行时异常,在错误页面只显示“未知错误”。
在商品修改的controller方法中抛出异常:
在service接口中抛出异常:
如果与业务功能相关的异常,建议在service中抛出异常。
与业务功能没有关系的异常,建议在controller中抛出。
上边的功能,因为要修改商品,商品信息必须不能为空才可以修改,故建议在service中抛出异常。