我的主要问题是如何处理我抛出的异常?
例如:
Contract.Requires(foo != null);
对于这个抛出的异常,在函数调用的上层做什么?
我是否应该忽略它,当我看到它时就知道我的设计有问题并修复它?
但是,如果我在没有契约(Contract)的情况下进行部署,那么在部署中会发生什么,我将得到一个 foo == null 的参数,而我的逻辑不知道如何处理这样的参数。然后一切都会崩溃。
有人可以解释如何处理所有这些情况吗?
谢谢
最佳答案
My main question is what to do with those Exceptions that I throw?
首先,从技术上讲,您无法捕获这些异常。除 Contract.Requires<TExc>()
之外的所有方法扔一个System.Diagnostics.Contracts.__ContractsRuntime.ContractException
它嵌入到您的程序集中并且是私有(private)的。为了捕获它,您必须捕获所有异常,这是您能做的最糟糕的事情。
契约和断言都是必须始终为真的条件。如果不是,则程序处于其设计目的之外的状态,并且您无法确定它是否可以安全地继续。您可以将契约视为语言的扩展。您不希望 .NET 程序让您在“特殊情况”下违反类型安全,对吗?契约(Contract)也是如此。
What to do in uper levels of the function call with this thrown exception?
契约的整个想法是强制调用者在调用带有契约的方法之前进行检查。如果来电者没有检查并且做错了什么 - 它必须被修复。我的意思是:如果你有 Contract.Requires(arg != null)
的方法, 好吧,如果你有 null
就不要调用它值(value)。
另一个问题是“您是否应该将所有合约保留在已发布的位中?”从安全的角度出发,最好全部保留。
如果您的代码不期望某些值但它获取了它们,唯一绝对安全的决定是停止当前操作并出错。你不能确定如果你忽视你的契约(Contract)你就不会破坏数据或做其他坏事。当然,您需要一定程度的粒度,让您的程序在安全状态下继续运行,而不是突然终止,尽管在某些情况下终止是必需的。
Should I ignore it , and just when I see it know that something wrong with my design and fix it?
如果您发布您的软件并发现有一个用例由于契约(Contract)失败而无法工作,即使没有契约(Contract)它也可能无法工作 - 您只是没有仔细考虑并且已经做一些额外的工作来支持它。您应该担心仔细设计所有用例并执行彻底的 QA 以避免这种情况。契约(Contract)与这些问题无关。
But what would happen in deployment if I deploy without the Contracts and I will get an argument that is foo == null, and my logic has no clue how to deal with argument like this. Then everything will crash.
这是保留契约(Contract)的另一个原因。在预先设计的地方发生崩溃比在您不希望发生的地方发生崩溃要好。
也许,删除某些契约的唯一重要原因是性能:在每个方法之后检查不变量可能非常昂贵。
关于c# - 代码约定如何处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8455897/