代码合同如何处理异常

Nig*_*ker 4 .net c# code-contracts

我的主要问题是如何处理我抛出的异常?

例如:

 Contract.Requires(foo != null);
Run Code Online (Sandbox Code Playgroud)

如何在函数调用的uper级别中执行此抛出的异常?

我应该忽略它,当我看到它知道我的设计有问题并修复它时?

但是如果我在没有Contracts的情况下进行部署会发生什么呢?我会得到一个foo == null的参数,而且我的逻辑不知道如何处理这样的参数.然后一切都会崩溃.

有人可以解释如何处理所有这些情况吗?

谢谢

Pav*_*lov 18

我的主要问题是如何处理我抛出的异常?

首先,您在技术上无法捕获这些异常.除了所有方法都Contract.Requires<TExc>()抛出一个System.Diagnostics.Contracts.__ContractsRuntime.ContractException被嵌入到你的组装和是私人的.为了捕获它,你必须捕获所有异常,这是你可以做的最糟糕的事情.

合同和断言是必须始终为真的条件.如果不是,那么程序是,它并没有被设计为一个状态,你无法确定它是否可以安全地继续.您可以将合同视为语言的扩展.您不希望.NET程序让您在"特殊情况下"违反类型安全,对吗?合同也是如此.

如何在函数调用的uper级别中执行此抛出的异常?

合同的整个想法是在调用带有合同的方法之前强制调用者进行检查.如果调用者没有检查并做错了什么 - 必须修复它.我的意思是:如果你有一个方法Contract.Requires(arg != null),那么,如果你有一个null值,那就不要调用它.

另一个问题是"你是否应该将所有合同留在已发布的位中?" 从安全位置来看,你最好保留它们.

如果你的代码不期望某些值,但它得到它们,那么唯一绝对安全的决定就是暂停当前操作并出现错误.您无法确定如果忽略合同,则不会损坏数据或执行其他不良操作.当然,您需要一定程度的粒度才能让您的程序继续处于安全状态,而不是以大爆炸终止,尽管在某些情况下需要终止.

我应该忽略它,当我看到它知道我的设计有问题并修复它时?

如果您发布软件并发现由于合同失败而导致用例无效,即使没有合同,它也可能无效 - 您只是没有考虑过它而且必须做一些额外的工作来支持它.您应该担心仔细设计所有用例并执行彻底的QA以避免这种情况.合同与这些问题无关.

但是如果我在没有Contracts的情况下进行部署会发生什么呢?我会得到一个foo == null的参数,而且我的逻辑不知道如何处理这样的参数.一切都会崩溃.

这是签订合同的另一个原因.最好是在预先设计好的地方发生碰撞,而不是发生在你预期不会发生的地方.

也许,删除某些合同的唯一重要原因是性能:在每种方法之后检查不变量可能非常昂贵.