如何在运行时处理代码合同违规

时间:2011-05-01 09:15:26

标签: .net error-handling code-contracts

我上周访问了荷兰的devday11并了解了Code Contract。我正在考虑实施代码合同,但以下内容仍然不清楚。我应该如何处理我的应用程序中的运行时代码合同违规?

例如,我的应用程序中有一个图层调用另一个具有空值的图层。调用的函数具有必需的联系人,因此它会引发合同验证错误。应如何处理?像这样的东西

public string GetOrderSomething(OrderModel order)
{
 Contract.Requires(order != null);
 // jibidi jibeda do something
 }  

//other application layer
private void something()
{
 Class.GetOrderSomething(null);
}

该怎么办?我应该用正常的尝试抓住它,我根本不应该处理它吗?我应该做些什么“特别”的事情吗?

3 个答案:

答案 0 :(得分:3)

对于这种情况,你应该做你通常会做的事情

if(order == null){   抛出新的ArgumentNullException(); }

这个CodeContract并不意味着只是因为你将错误的参数传递给方法而导致类不稳定...

但是,如果这是一个需要某个内部成员,你知道它永远不应该是null,那么这是另一个故事。你会有一个永久不可行的课程,如果你无法通过捕捉来“修复”,那么可能会引发一些致命的异常并发出警告。

答案 1 :(得分:1)

在我看来,Codecontracts应该用于在运行时查找编程错误。

因此,codecontract-violation-execptions应该像其他编程错误异常一样处理(即IndexOutOfBoundException)

答案 2 :(得分:1)

假设您已经制定了“异常处理”政策,则不必做任何特别的事情。

如果建议选择特定的例外:

public string GetOrderSomething(OrderModel order)
{
  Contract.Requires<ArgumentNullException> (order != null, "order");
  // jibidi jibeda do something
}

现在,您可以使用与没有(之前)使用合同相同的方式和位置来处理ArgumentNullException。

PS:希望你喜欢这个话题。