Java异常处理策略

【异常的由来】
任务与预先设定的规则不相符的情况都可以称之为异常。但凡业务逻辑操作,都会划定一些边界或规则,但是往往事与愿违,总会有调皮鬼来挑战系统的健壮性。这些调皮鬼包括:

1、系统用户。用户并不都是知道潜规则的,比如用户的银行账户中只有100块钱,但是用户不查询就直接取200块。
2、开发人员。码农有时候太过自信了,比如你在编写文件下载功能时忽略了文件有可能不存在这个分支流程。
3、运行环境。软件系统也是要靠天吃饭的,谁都保不准网络一直畅通,硬盘一直稳定。

【异常处理框架】
有问题我们就要解决问题,如果问题解决不了,那么就把问题的影响面降到最低。对于异常也是如此,为了提高健壮性,需要对于异常进行兼容。处理异常一个很重要的原则是不逃避,不歪曲。吞异常与提供错误的异常信息一样罪恶。对于异常的处理框架可以大致分为以下几点:

1、异常类封装。根据异常产生的原因,我们把异常封装为两类,分别是业务逻辑异常(BusinessException)和系统编程异常(ProgramException),分类的目的是进行分类处理。
2、异常检测类。这是产生异常的地方,包括了业务逻辑检测(对于不符合业务逻辑的情况封装异常抛出),还包括了对于底层异常的转化封装(比如将数据库操作产生的异常捕获并封装为ProgramException)。
3、异常处理类。这是异常的终点,在此异常会以一种比较合适的方式对系统运维人员和系统的用户进行优雅的展示(比如记录日志或者页面提示)。

同时,为了统一的编码风格,我们对于异常的处理做如下约定:

1、只有最靠近用户的层面才会最终处理异常。这个用户包括了系统真实的自然人用户,也包括了一些系统,比如定时器或者命令行交互等。其他各层只负责捕获底层的异常并向上传递即可。
2、对于系统编程异常,对用户进行统一的提示语,并记录异常日志,通过监控系统用户系统运维人员进行监控告警。
3、对于业务逻辑异常,需要根据不同的异常类型以及上下文情况,对用户进行友好性的提示。同时考虑到对于用户的提示属于产品文案的一部分,可能会经常变化的特点,需要把提示语通过“错误码--提示语”的形式进行配置。
4、为了便于对错误码进行统一管理,约定一下错误码的编码规则:[错误消息类型(一位)] + [系统组编号(两位数字)]  + [子系统编号(两位数字)] + [顺序编号(两位数字)]。
5、其中错误消息类型取值:E——普通错误消息;W——警告类消息;Q——询问类消息;F——致命错误消息

【WEB工程异常处理】
对于WEB系统,由于我们使用的是Spring MVC框架,因为针对此种框架进行说明。

1、封装两个实体类:BisinessException和SystemException。
2、增加HandlerExceptionResolver 接口的实现类MyExceptionHandler,代码如下:
public class MyExceptionHandler implements HandlerExceptionResolver {  
  
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {  
        Map<String, Object> model = new HashMap<String, Object>();  
        model.put("ex", ex);  
          
        // 根据不同错误转向不同页面  
        if(ex instanceof BusinessException) {  
            return new ModelAndView("error-business", model);  
        }else if(ex instanceof ParameterException) {  
            return new ModelAndView("error-parameter", model);  
        } else {  
            return new ModelAndView("error", model);  
        }  
    }  
}  

3、在Spring的配置文件applicationContext.xml中增加以下内容:
<bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/>
 
4、对于Unchecked Exception而言,增加对应的errorpage:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>

5、系统采用与系统风格统一的的error page页面。

【参考资料】
1、http://cgs1999.iteye.com/blog/1547197

猜你喜欢

转载自openshell.iteye.com/blog/2081886