我上周访问了荷兰的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);
}
该怎么办?我应该用正常的尝试抓住它,我根本不应该处理它吗?我应该做些什么“特别”的事情吗?
答案 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:希望你喜欢这个话题。