代码合同并确保不会抛出任何异常

时间:2014-01-16 15:35:19

标签: c# code-contracts design-by-contract

我想知道我是否能够使用Microsoft Code Contracts来验证方法不会抛出任何异常的不变量。用例如下: 我有一个附加了记录器的导入器,导入器使用基类为导入器定义导入的各个阶段:

  • 读取文件;
  • 将数据存储到通用数据记录中;
  • 从记录创建域对象;
  • 在项目的上下文中验证域对象;
  • 将有效的域对象放入项目中。

每个阶段都由该导入器基类的抽象方法表示。我想确保每个阶段的不变量,它不会抛出任何记录的异常。因此,“读取文件”阶段应该处理所有与文件访问相关的问题(例如DirectoryNotFoundException),使用记录器记录问题并返回null。

实质上,我们希望通过记录器引导问题。并根据问题的严重程度,中止导入,继续而忽略问题。

我很快就阅读了the manual,但没有找到任何可用于此的内容。它可能吗?或者这是不可能的,实际上有一个很好的理由让我失踪?

1 个答案:

答案 0 :(得分:1)

我认为不可能验证它不会抛出任何异常,因为异常可能来自运行时本身;考虑OutOfMemoryException或StackOverflowException。

事实上,我认为这就是为什么在一般情况下很难 - 如果你正确使用异常,那么它们通常会由程序的外部输入引起,因此无法验证。

(如果异常是由程序中的错误引起的,那么你可能会使用前置条件来捕获它)

实际上,想一想,已经有一种编译器支持的方式来验证抛出或处理异常......只是不在.NET中:D。 Java检查过的异常似乎可以满足您的使用案例,但即便是Java自己的社区似乎也认为它们现在是个坏主意。