如何编写健壮的程序
以下紧为个人观点,希望大家讨论和完善,并设计较为好用的类库 编写健壮程序,首先正确的理解类库,
考虑异常处理和输入参数校验,其次是跟踪和改进。
概念
程序的执行就是系统状态的变化过程,任何一个方法的执行,对象和系统会进入下一个状态。错误的发生可归结为:
参数错误
状态错误,方法执行的前提条件没有得到满足
这些处理,在公有的(public)方法或类和非公有的方法或类处理中是不一样的,比如在私有的方法中,一般不用有用参数校验,因为它的调用者通常是程序的编写者自己。但输入参数是否为空对象,可以在调用之前进行诊断,然后进行相应的处理(或者不判断但系统会引发运行时错误)。
参数校验一般是指用户输入和应用程序的调用时的参数输入校验,前者应该为程序必须处理的可恢复的异常,后者通常导致程序的执行逻辑产生的运行时异常,如典型的数组越界和空指针,一般在程序的设计中有一般的处理方式,在java中抛出IllegalArgumentException或进行错误翻译到适当的抽象层次进行抛出。
异常一般有三种级别:
可恢复,被检查的异常,这类是调用应用程序必须处理的,我们写程序处理的多半为这种异常。
运行时错误,绝大部分为不可恢复的异常。此种异常的抛出时,通常调用的功能不能成功的执行,但不是严重的,应用程序不会崩溃。这类异常的处理就非常重要,它会影响你程序的失败范围。
非常严重的错误,它可能会导致整个应用程序崩溃,在JAVA中通常抛出为ERROR类型错误,通常的起因为资源枯竭,环境严重错误。
对于在应用程序的体系结构设计中,其传播途径和处理方式,大家要达成共识,
首先为要把异常和正常区分开来,一个抛出太多异常的接口,只会使程序过度复杂,一些需要处理的异常也不能加重别人的负担。其次对用户的输入校验应该作为被检查的异常来处理,它是用户可能出现的一种情况,也是用户输入和输出接口的一部分,这类处理抛出的错误信息集中保存便于修改,并使用统一的接口进行读取,并放在公共的包类大家一起使用。
比如在apache的java项目axis开发中Developer'sGuide建议大家如此使用
HandleSpecificExceptionsinInnerCode
CatchAllExceptionsinOutermostFlowofControl
CatchingandLoggingExceptions
下表为JAVA中最常用的异常类:
Table1。CommonlyUsedExceptions
ExceptionOccasionforUse
IllegalArgumentException非法参数
IllegalStateException对象非法状态
NullPointerException空值参数
IndexOutOfBound*ception下标越界
UnsupportedOperationException没有实现的方法。
原则
以下为异常处理的基本原则:
1.Useexceptionsonlyforexceptionalconditions
只对异常情况使用异常处理,不要使用异常实现控制结构,对于经常发生的可预计事件不要采用异常
2.Usecheckedexceptionsforrecoverableconditionsandrun-timeexceptionsforprogrammingerrors
在可恢复的情况下抛出异常,程序错误使用运行时异常
3.Avoidunnecessaryuseofcheckedexceptions
避免过多的不必要的被检查的异常
4.Favortheuseofstandardexceptions
尽量使用标准异常
5.Throwexceptionsappropriatetotheabstraction
异常的抛出有正常的抽象级别
6.Documentallexceptionsthrownbyeachmethod
使用文档记录抛出的异常,例如JAVADOC@exceptionnamedescription
7.Includefailure-captureinformationindetailmessages
包括错误的详细信息
8.Striveforvetbfailureatomicity
使失败原子性,不要让程序在不正确的状态,比如出错事务回滚
9.Don'tignoreexceptions
不要忽视(不处理)异常
设计
设计的目标为统一和规范化错误处理的流程,设计统一的共用类,大家进行统一调度。为了达到以上目标使用如下的原则:
1错误的详细信息统一保存
2用户的输入校验,网页只处理是否为空和去掉头尾空格,客户断逻辑进行类型转换,业务逻辑层进行校验,然后查询错误信息,使它成为最终的详细的错误信息返回给用户。
3异常的产生,调用者对非用户输入参数校验和状态错误产生的异常,使用第5和第7条规则
错误信息表
4当然跟踪和诊断也是不可少的