如何编写健壮的程序

原创 2004年06月30日 18:02:00
以下仅为个人观点,希望大家讨论和完善,并设计较为好用的类库


编写健壮程序,首先正确的理解类库,
考虑异常处理和输入参数校验,其次是跟踪和改进。

概念
程序的执行就是系统状态的变化过程, 任何一个方法的执行,对象和系统会进入下一个状态。错误的发生可归结为:
? 参数错误
? 状态错误,方法执行的前提条件没有得到满足
这些处理,在公有的(public)方法或类和非公有的方法或类处理中是不一样的,比如在私有的方法中,一般不用有用参数校验,因为它的调用者通常是程序的编写者自己。但输入参数是否为空对象,可以在调用之前进行诊断,然后进行相应的处理 (或者不判断但系统会引发运行时错误)。

参数校验一般是指用户输入和应用程序的调用时的参数输入校验,前者应该为程序必须处理的可恢复的异常,后者通常导致程序的执行逻辑产生的运行时异常,如典型的数组越界和空指针, 一般在程序的设计中有一般的处理方式,在java中抛出IllegalArgumentException或进行错误翻译到适当的抽象层次进行抛出。

异常一般有三种级别:
? 可恢复,被检查的异常,这类是调用应用程序必须处理的,我们写程序处理的多半为这种异常。
? 运行时错误,绝大部分为不可恢复的异常。此种异常的抛出时,通常调用的功能不能成功的执行,但不是严重的,应用程序不会崩溃。这类异常的处理就非常重要,它会影响你程序的失败范围。
? 非常严重的错误,它可能会导致整个应用程序崩溃,在JAVA中通常抛出为ERROR类型错误,通常的起因为资源枯竭,环境严重错误。

对于在应用程序的体系结构设计中,其传播途径和处理方式,大家要达成共识,
首先为要把异常和正常区分开来,一个抛出太多异常的接口,只会使程序过度复杂,一些需要处理的异常也不能加重别人的负担。其次对用户的输入校验应该作为被检查的异常来处理,它是用户可能出现的一种情况,也是用户输入和输出接口的一部分,这类处理抛出的错误信息集中保存便于修改,并使用统一的接口进行读取,并放在公共的包类大家一起使用。
比如在apache的java项目axis开发中Developer's Guide 建议大家如此使用
Handle Specific Exceptions in Inner Code
Catch All Exceptions in Outermost Flow of Control
Catching and Logging Exceptions

下表为JAVA中最常用的异常类:
Table 1。 Commonly Used Exceptions
Exception Occasion for Use
IllegalArgumentException 非法参数
IllegalStateException 对象非法状态
NullPointerException 空值参数
IndexOutOfBoundsException 下标越界
UnsupportedOperationException 没有实现的方法。

原则
以下为异常处理的基本原则:
1. Use exceptions only for exceptional conditions
只对异常情况使用异常处理,不要使用异常实现控制结构,对于经常发生的可预计事件不要采用异常
2. Use checked exceptions for recoverable conditions and run-time exceptions for programming errors
在可恢复的情况下抛出异常,程序错误使用运行时异常
3. Avoid unnecessary use of checked exceptions
避免过多的不必要的被检查的异常
4. Favor the use of standard exceptions
尽量使用标准异常
5. Throw exceptions appropriate to the abstraction
异常的抛出有正常的抽象级别
6. Document all exceptions thrown by each method
使用文档记录抛出的异常,例如JAVA DOC @exception name des cription
7. Include failure-capture information in detail messages
包括错误的详细信息
8. Strive for vetbfailure atomicity
使失败原子性,不要让程序在不正确的状态,比如出错事务回滚
9. Don't ignore exceptions
不要忽视(不处理)异常

设计
设计的目标为统一和规范化错误处理的流程,设计统一的共用类,大家进行统一调度。为了达到以上目标使用如下的原则:
1 错误的详细信息统一保存
2 用户的输入校验,网页只处理是否为空和去掉头尾空格,客户断逻辑进行类型转换,业务逻辑层进行校验,然后查询错误信息,使它成为最终的详细的错误信息返回给用户。
3异常的产生,调用者对非用户输入参数校验和状态错误产生的异常,使用第5和第7条规则
错误信息表
4 当然跟踪和诊断也是不可少的

PHP程序员的能力水平层次

前言 之前看过很多篇关于服务端工程师和PHP开发者的能力模型介绍,每篇都对能力有侧重点.  下面我们来详细谈谈以开发能力为基准点的PHP程序员的能力水平层次. 层层递进 1.功能开...
  • sanbingyutuoniao123
  • sanbingyutuoniao123
  • 2016年05月22日 22:08
  • 1298

[后端服务]后端程序健壮性几点思考

参考文章:http://www.cnblogs.com/LBSer/p/4753112.html   对每一个程序员而言,故障都是悬在头上的...
  • BaiHuaXiu123
  • BaiHuaXiu123
  • 2017年01月04日 10:29
  • 1297

编码规范——程序员的自我修养(代码样例为lua代码或c++代码)

------------------------------------ --命名部分(适用于lua代码及c++代码) ------------------------------------ ...
  • mywcyfl
  • mywcyfl
  • 2014年07月11日 23:46
  • 1812

PL/SQL异常处理学习之——如何编写健壮的程序

程序中经常会出现写不友好的事情,导致程序瘫痪,所以我们有必要处理这些异常。下面我就来总结下PL/SQL异常处理需要知道的知识。 一、经常用到的内置PL/SQL异常 1、No_data_found:...
  • joyksk
  • joyksk
  • 2017年06月05日 22:41
  • 423

setsockopt()改善程序的健壮性

  • 2011年10月24日 20:24
  • 14KB
  • 下载

AJAX异步请求程序的健壮性和数据协调.pdf

  • 2008年11月30日 13:30
  • 153KB
  • 下载

浅析:setsockopt()改善程序的健壮性

http://blog.csdn.net/zhci31462/archive/2007/05/01/1594197.aspx1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口...
  • ztguang
  • ztguang
  • 2016年03月30日 10:03
  • 158

浅析:setsockopt()改善程序的健壮性

不断的收到coolmei25 (梅生)的答谢,我都不好意思了(我都没帮到他),下面写出我在网络编程中的一点心得体会,希望对他(^_^也对大家)有帮助: 1. 如果在已经处于 ESTABLISHED状态...
  • suxinpingtao51
  • suxinpingtao51
  • 2013年09月18日 18:07
  • 638

如何写出健壮的JAVA程序的一些心得。

在我们的程序中,尽管我们的程序流程可能都是正确的,但仍然可能受一些外界因素的影响而出现意外导致程序未按预期流程执行。下面我就谈谈工作中遇到的一些意外:        1.在web程序中,参数由前台传递...
  • FlexAndSpring
  • FlexAndSpring
  • 2011年07月25日 15:08
  • 847

程序健壮性: 正常、错误和异常

准确而细致的错误处理是确保程序健壮性的重要关卡。                           ---------   引        很容易分清正常和错误的区别,但不容易分辨错误和...
  • shuqin1984
  • shuqin1984
  • 2012年12月01日 06:19
  • 692
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何编写健壮的程序
举报原因:
原因补充:

(最多只允许输入30个字)