代替 try / catch / throw 的通常做法是返回一个返回代码(有时称为错误代码),例如,printf(), scanf() 和 malloc()就是这样工作的:调用者通过if等语句来测试返回值判断函数是否成功。
尽管返回代码技术有时是最适当的错误处理技术,但会增加不必要的if语句这样的令人讨厌的效果。
质量降级:众所周知,条件语句可能包含的错误大约十倍于其他类型的语句。因此,在其他都相同时,如果你能从代码中消除条件语句,你会得到更健壮的代码。
推迟面市:由于条件语句是分支点,而它们关系到白盒法测试时的测试条件的个数,因此不必要的条件语句会增加测试的时间总量。如果你没有走过每个分支点,那么你的代码中就会有在测试中没有被执行过的指令,直到用户/客户发现它,那就糟糕了。
增加开发成本:不必要的控制流程的复杂性增加了寻找bug,修复bug,和测试的工作。
因此,相对于通过返回代码和if来报告错误,使用try / catch / throw所产生更少有bug,更低的开发成本和更快面市的代码。
如何处理构造函数的失败?
构造函数没有返回类型,所以返回错误代码是不可能的。因此抛出异常是标记构造函数失败的最好方法。
如果你没有或者不愿意使用异常,这里有一种方法。如果构造函数失败了,构造函数可以把对象带入一种“僵尸”状态。你可以通过设置一个内部状态位使对象就象死了一样,即使从技术上来说,它仍然活着。然后加入一个查询(“检察员”)成员函数,以便类的用户能够通过检查这个“僵尸位”来确定对象是真的活着还是已经成为僵尸(也就是一个“活着的死对象”)。你也许想有另一个成员函数来检查这个僵尸位,并且当对象并不是真正活着的时候,执行一个 no-op(或者是更令人讨厌的如 abort())。这样做真的不漂亮,但是如果你不能(或者不想)使用异常的话,这是最好的方法了。
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!