用断言和异常
D有两个致力于错误处理的特征:异常和断言.异常用来处理程序外部错误而断言用来验证程序内部的假定.换句话说,断言是个调试工具而异常处理情况已超出程序员控制范围.
如何做...
通过用断言和异常采取如下步骤:
每当你造一个关于程序状态的假定,显式用断定表达它.
每当环境或用户数据阻止你函数干活,抛异常.
写 断定(0);在你认为不可达代码的任何分支.
代码如下:
提示
你不能有太多断言.如你代码有漏洞,你将感谢所有断言帮你缩小它可能的位置.
如果你想轻松引发异常,试在一个只读目录中运行本程序.
它如何工作...
当决定你应该用断定或抛要考虑的关键因素:由于程序漏洞产生失败?断言是调试工具.在任何情况下,一个正确书写的程序不应该出现断言失败.确实,对dmd当用-释放开关编译,从生成代码移除了断言.异常,另一方面,不表明在程序中的漏洞.
提示
你可用版本(断定)来当允许断言时编译代码.
一般,异常仅在一个程序不能完成其操作时抛.比如,一个检查文件是否存在的函数不应该在未发现文件时抛异常.相反,它应该简单中假.然而,一个复制或附加至文件的函数应在未发现文件时抛异常,因为不可能复制不存在的文件.函数由于超出程序员控制的因素不工作,因此适用异常.
每当你编程时假定状态,你应该用断言显式把它写出来.断言太多没害处.他们从发布版本移除以便在你最终版本不花成本,而你可节约大量调试时间如果证明其中一个你的假定无效!比如,我们用先前的区间描述断定.假定我们在调用前前没有正确检查空的.本将导致我们程序阅读崩溃的数据,未发现问题,直到它破坏文件或在生产中引起一些其他漏洞.
那是断定的力量;当经常用时,一旦程序的状态变得无效,他们帮助发现漏洞.一个失败断言给了位置(源码中的文件和行数),栈跟踪,和可选的,串消息(断定的第二个实参).未检查到的漏洞导致崩溃或崩溃结果.
提示
在断言中避免有副作用的函数.当调试时,你的程序可能不经意的依赖那些副作用随后在移除了那些函数调用时的发布模式打断.
异常用于你控制外的事情.即使你完美编程,如果条件仍可失败用异常而不是断言.应该用不同类型异常(从异常继承的子类)来表明不同类问题.d标准库未提供通用异常层次,相反当需要时选择创建异常子类.你也应该这样因为用抓语句处理异常通过动态类型区分他们;用子类将让你函数的消费者选择他们可处理的异常类型,而其他不变.
注意
抛异常而不是用断定不是错误.它稍微无效并可能使用户奇怪.当写库时,有人选择用异常而不是断言即使它是个程序员漏洞,因为用户代码超出库作者控制.这个防御性编程没错,但一般,即使在库中,D鼓励断言.然而,如果你怀疑,异常总是对的.
另见
见在第1章,核心任务用一个自定义异常类型方案
领取专属 10元无门槛券
私享最新 技术干货