如何在C#中处理代码契约中的异常

时间:2016-07-18 16:00:51

标签: c# code-contracts

我开始玩Code Contracts for .NET了。

  1. 我已经安装了msi。
  2. 在我的示例控制台应用程序中,在项目属性中,我将“Assembly Molde”设置为“标准合同要求”。
  3. 我已将“执行运行时合同检查”检查为“完整”。
  4. 有了这个设置,我在我的代码中使用了非常标准的Contract.Require()。我不能把它放在try块中,因为它应该放在方法体的最顶层。所以,我的问题是当我不满足“Require()”条件时,我如何处理它可能抛出的异常?

    如果输入正确,我的代码运行良好,使用预期的错误输入,它会抛出一个无法处理的异常。我想我在这里的大局中缺少一些部分,或者我的项目的合同选项可能没有很好。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

  

所以,我的问题是我如何处理它可能抛出的异常,当"要求()"条件不满意?

您永远不会在生产代码中处理该异常,因为该异常从不在正确的程序中抛出。存在例外情况是告诉呼叫者他们做错了,并且在修复之前他们无法将代码发送给客户。如果从不抛出异常,则永远不需要处理它。

在测试代码中,您可以执行测试框架表示的任何操作"我希望此代码在以下错误条件下抛出以下异常"。

现在,这些事实暗示了使用代码合同的代码设计,即必须有一种方法让调用者知道他们不会在不尝试的情况下违反合同并抓住失败

我调用设计糟糕的程序引发的异常,这些程序要求调用者处理失败"烦恼的异常"。也就是说,你永远不应该设计这样的程序:

private Phase PhaseOfMoon() { ... }
public void M()
{
  Contract.Requires(this.PhaseOfMoon() != Phase.Full);

请参阅调用者无法知道您的私有方法将要执行的操作,因此调用者必须捕获异常。您需要确保调用者总是有办法保证不会抛出异常或不会违反Require前提条件。

简而言之:你的责任是给他们一个避免例外的方法;他们的责任是避免它。没有人负责处理它。