我想知道我是否能够使用Microsoft Code Contracts来验证方法不会抛出任何异常的不变量。用例如下: 我有一个附加了记录器的导入器,导入器使用基类为导入器定义导入的各个阶段:
每个阶段都由该导入器基类的抽象方法表示。我想确保每个阶段的不变量,它不会抛出任何记录的异常。因此,“读取文件”阶段应该处理所有与文件访问相关的问题(例如DirectoryNotFoundException
),使用记录器记录问题并返回null。
实质上,我们希望通过记录器引导问题。并根据问题的严重程度,中止导入,继续而忽略问题。
我很快就阅读了the manual,但没有找到任何可用于此的内容。它可能吗?或者这是不可能的,实际上有一个很好的理由让我失踪?
答案 0 :(得分:1)
我认为不可能验证它不会抛出任何异常,因为异常可能来自运行时本身;考虑OutOfMemoryException或StackOverflowException。
事实上,我认为这就是为什么在一般情况下很难 - 如果你正确使用异常,那么它们通常会由程序的外部输入引起,因此无法验证。
(如果异常是由程序中的错误引起的,那么你可能会使用前置条件来捕获它)
实际上,想一想,已经有一种编译器支持的方式来验证抛出或处理异常......只是不在.NET中:D。 Java检查过的异常似乎可以满足您的使用案例,但即便是Java自己的社区似乎也认为它们现在是个坏主意。