c# - 代码约定如何处理异常

标签 c# .net code-contracts

我的主要问题是如何处理我抛出的异常?

例如:

 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/

相关文章:

c# - 尝试在 C# 上使用 AutoCAD 类镜像绘图

c# - WebForms 使用回车键提交特定表单(不点击)

c# - 从验证方法中删除重复项

linphone 的 C# 包装器

c# - 为什么使用默认(类型)时契约(Contract)格式错误?

c# - 我可以使用代码契约来解决无法使用通用构造函数约束的问题吗?

c# - 无法获取属性值 'unobtrusive' : object is null or undefined

.NET 引用 "Copy Local"根据 GAC 的内容设置 True/False

c# - 为来自 .NET Windows 服务的新线程设置 CultureInfo

c# - 我是否错误地实现了这个简单的契约(Contract)?