我已经开始使用Code Contracts for .NET了.
有了这个设置,我在我的代码中使用了非常标准的Contract.Require().我不能把它放在try块中,因为它应该放在方法体的最顶层.所以,我的问题是当我不满足"Require()"条件时,我如何处理它可能抛出的异常?
通过正确的输入,我的代码运行良好,使用预期的错误输入,它会抛出一个无法解决的异常.我想我在这里的大局中缺少一些部分,或者我的项目的合同选项可能没有很好.
谢谢你的帮助.
所以,我的问题是当我不满足"Require()"条件时,我如何处理它可能抛出的异常?
您永远不会在生产代码中处理该异常,因为该异常永远不会在正确的程序中抛出.存在例外情况是告诉调用者他们做错了,并且在修复之前他们无法将代码发送给客户.如果永远不会抛出异常,则永远不需要处理它.
在测试代码中,您可以执行测试框架所做的任何操作来表示"我希望此代码在以下错误条件下抛出以下异常".
现在,这些事实暗示了使用代码契约的代码设计,即必须有一种方法让调用者知道他们不会在没有尝试和捕获失败的情况下违反合同.
我称之为设计糟糕的程序引发的异常,这些程序要求调用者处理"烦恼异常"的失败.也就是说,你永远不应该设计这样的程序:
private Phase PhaseOfMoon() { ... }
public void M()
{
Contract.Requires(this.PhaseOfMoon() != Phase.Full);
Run Code Online (Sandbox Code Playgroud)
请注意,调用者无法知道您的私有方法将要执行的操作,因此调用者必须捕获异常.您需要确保调用者总是有办法保证不会抛出异常或Require
不违反前提条件.
简而言之:你的责任是给他们一个避免例外的方法; 他们的责任是避免它.没有人负责处理它.