Java异常处理策略

标签: java 异常处理 策略 | 发表时间:2014-06-17 18:47 | 作者:openshell
出处:http://www.iteye.com
【异常的由来】
任务与预先设定的规则不相符的情况都可以称之为异常。但凡业务逻辑操作,都会划定一些边界或规则,但是往往事与愿违,总会有调皮鬼来挑战系统的健壮性。这些调皮鬼包括:

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

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 异常处理 策略] 推荐:

Java异常处理策略

- - 研发管理 - ITeye博客
任务与预先设定的规则不相符的情况都可以称之为异常. 但凡业务逻辑操作,都会划定一些边界或规则,但是往往事与愿违,总会有调皮鬼来挑战系统的健壮性. 用户并不都是知道潜规则的,比如用户的银行账户中只有100块钱,但是用户不查询就直接取200块. 码农有时候太过自信了,比如你在编写文件下载功能时忽略了文件有可能不存在这个分支流程.

Java异常处理的陋习展播

- - 博客 - 伯乐在线
注:本文来自志军(@ _Zhijun )在微博推荐的一篇转载于2007年09月27的旧文,他说“没法找到原作者”. 的确,我也花了半个多小时在找原作者. 先是找到了一个标注“2005年6月18日转字Java研究组织”的文章(“Java研究组织”的域名已过期),后来找到是大连理工大学碧海青天BBS上一个发于的2003年5月中旬的 合集帖子,其中提到一条来自 CSDN 的链接,可惜该链接已挂,否则应该能找到作者的.

Java Socket常见异常处理

- - BlogJava-qileilove
java网络编程Socket通信中,通常会遇到以下异常情况:.   第1个异常是 java.net.BindException:Address already in use: JVM_Bind.   该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时.

深入理解java异常处理机制

- - 编程语言 - ITeye博客
       try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解. 不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话. 那你看看下面的代码,“猜猜”它执行后的结果会是什么. 不要往后看答案、也不许执行代码看真正答案哦.

Java 异常处理的误区和经验总结

- - 编程语言 - ITeye博客
原文:http://www.ibm.com/developerworks/cn/java/j-lo-exception-misdirection/index.html. 本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳. 只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验,提高产品的价值.

Java 编程中关于异常处理的 10 个最佳实践

- - 博客 - 伯乐在线
英文原文: 10 Exception handling Best Practices in Java Programming 编译: oschina. 异常处理是书写 强健 Java应用的一个重要部分. 它是关乎每个应用的一个非功能性需求,是为了优雅的处理任何错误状况,比如资源不可访问,非法输入,空输入等等.

Oracle 异常处理

- - 编程语言 - ITeye博客
使用RAISE_APPLICATION_ERROR存储过程. ============================================================ */ --演示该存储过程 BEGIN. RAISE_APPLICATION_ERROR(-20000, 'Account past due.');-- explicitly raise exception END; --创建子程序 CREATE OR REPLACE PROCEDURE account_status (.

JAVA优化代码策略(一)

- - Web前端 - ITeye博客
在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身. 所以养成好的代码编写习惯非常重要. 比如:String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替. 由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理. 因此,生成过多的对象将会给程序的性能带来很大的影响.

spring mvc 异常处理(转)

- - 编程语言 - ITeye博客
链接:http://gaojiewyh.iteye.com/blog/1297746 (附源码). 链接:http://zywang.iteye.com/blog/983801 . 链接:http://www.cnblogs.com/xguo/p/3163519.html . 链接:http://fuliang.iteye.com/blog/947191 .

Oracle异常处理概念

- - Oracle - 数据库 - ITeye博客
5.1.1 预定义的异常处理. 5.1.2 非预定义的异常处理. 5.1.3 用户自定义的异常处理. 5.1.4  用户定义的异常处理. 5.2.1 在执行部分引发异常错误. 5.2.2 在声明部分引发异常错误. 5.3 异常错误处理编程. 5.4  在 PL/SQL 中使用 SQLCODE, SQLERRM异常处理函数.