"善守"之道--谈软件开发中的监错/防错设计和异常处理机制问题

 

声明:本文发表于程序员杂志今年第5期,略有删节,非经杂志社和作者书面许可,请勿擅自转载部分或全部内容。


善守者,敌不知其所攻。 -孙子兵法 虚实篇
1总论
No program is bug-free,这是软件工程中一个无法证明但确得到普遍认可的命题。如果把软件测试看成是向五花八门的潜在的Bug发动的"进攻",那么在软件编码过程中生产高质量可靠的代码便可以看成为抵御各钟潜在的设计缺陷和运行错误而修筑的"防守"工事。可以这么说,一个程序的错误和异常处理机制(Error/Exception Handling Mechanism)是决定软件质量和可靠性的至关重要的因素,也是软件工程中值得关注的焦点之一。当一个项目开始时,往往就要考虑它使用什么样的监错/防错设计以及异常处理机制。

孙子兵法对于防守的最高境界的描述是:"我不欲战,虽画地而守之,敌不得与我战者,乖其所之也",而对于软件编码而言,则是在限定的时间内,交付稳定可靠的程序,尽可能避免因为设计失当而造成的错误,同时对于各种运行时可能发生的异常能够正确的处理,不致引起程序的瘫痪乃至系统的崩溃等"灾难性的后果"。
2区分错误和异常
孙子曰:"水因地而制流,兵因敌而制胜",而对于编写可靠稳定代码而言,首先要明确的一点我们面对的"敌人"是什么,从而对于不同的敌人采取不同的策略。这里我们要强调的是,必须明确区分软件中的"错误(Error)"和"异常(Exception)",值得特别注意的是,这里的"异常"是广义的概念,并不等同于现代软件编程语言中的try/throw/catch异常处理机制,后者只是前者的一种解决方法,后文有详细论述。

让我们先来看看一个error和exception的定义:

"Error…indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions."
("错误"是理性的程序不应该试图捕获的严重问题,大部分这样的错误是非正常的情况)
 
"Exception…indicates conditions that a reasonable application might want to catch."
("异常"是理性的程序所应当捕获的情况)
 
初学编程的最容易犯的一个概念性错误便是搞混了这二者的区别,从上面的定义我们可以看出,这二者的共性都是我们在进行程序开发时所不期望发生的情况(unexpected conditions),而这两者的区别也是非常明显的:

首先,从两者的时间范畴(timing domain)看:错误是程序在运行时(run-time)所"不应捕获"的,也就是意味着对于错误的防治应当在运行时之前,即设计时(design-time);而异常则是在运行时(Run-time)必须和应当捕获和处理的;

其次,从两者的解决机制(handling mechanism)看:对于错误由于我们无法在运行时加以捕获处理,更多的是要取监测之,发现之,从而纠正之(监错),或者为了保证潜在的错误不带来灾难性的后果而在编程中加以预防(防错);而对于异常,我们更关心的是去捕获之,从而处理之。

下面将用具体的例子说明这两者的区别及其处理机制的不同,并在文章的最后,给出一个完整的例子说明错误防治策略和异常处理机制在实际项目中的运用。
3监错设计和防错设计
广义的说,程序中的错误有两类,语法错误(Syntax Error)和逻辑错误(Logic Error),本文中

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值