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

How to Handle Exceptions in Code Contracts in C#

我开始玩 Code Contracts for .NET

  1. 我已经安装了msi。
  2. 在我的示例控制台应用程序中,在项目属性中,我已将 "Assembly Molde" 设置为 "Standard Contract Requires"。
  3. 我检查了 "Perform Runtime Contract Checking" 到 "Full"。

有了这个设置,我在我的代码中使用了非常标准的 Contract.Require() 。我不能将它放在 try 块中,因为它应该放在方法主体的最顶部。所以,我的问题是当 "Require()" 条件不满足时,我如何处理它可能抛出的异常?

在输入正确的情况下,我的代码运行良好,在输入错误的情况下,它会抛出一个未经处理的异常。我想我在这里遗漏了一些全局的部分,或者我的项目的合同选项设置得不好。

感谢您的帮助。

So, my question is how I handle the exceptions that it may throw, when the "Require()" condition is not satisfied?

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

在测试代码中,您可以执行测试框架所做的一切来表示 "I expect this code to throw the following exception under the following error conditions"。

现在,这些事实暗示了使用代码契约的代码设计,即,必须有一种方法让调用者知道他们不会违反契约而无需尝试并捕捉失败.

我调用设计不当的程序抛出的异常,这些程序需要 调用者处理失败"vexing exceptions"。也就是说,你永远不应该设计这样的程序:

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

看,调用者无法知道您的私有方法将要做什么,因此调用者必须捕获异常.您需要确保调用者始终有办法保证不会抛出异常或不会违反Require前提条件。

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