4

我刚刚开始使用 .NET 的代码合同,我有一个像这样的保护条款

if (!file.Exists(path)) throw FileNotFoundException();

并将其替换为

Contract.Requires(File.Exists(path));

我不确定这是否正确,因为合同将处理 I/O 问题,但不确定这是否是一个问题。

基本上问题是:使用合同来确保 I/O 问题(或外部/非单元问题)有什么问题吗?

4

2 回答 2

6

文件是否存在通常是先决条件,您将使用 Contract.Requires()。启用合同验证是可选的,通常不会在发布版本中启用。这使您的测试消失了。

坦率地说,你不应该写这样的代码。任何使用该文件的尝试都会产生异常,它将比您的版本提供更多信息。它包括无法找到的文件的名称。更重要的是, File.Exists() 在多任务操作系统上是不可靠的。该线程可以在 Exists() 调用之后立即被抢占,并且另一个进程中的另一个线程可以删除该文件。而且你手上会有一个 heisenbug:你会得到一个 FileNotFound 异常,即使你测试它存在。

我的电话:只需删除该语句。它带来的问题多于解决的问题。

于 2010-07-05T13:20:27.457 回答
3
  • 如果您不确定文件是否存在,请不要使用异常。
  • 如果文件应该存在,但在某些例外情况下可能不存在,请使用例外。
  • 如果您确定文件不存在是编程错误,请使用 Contract.Ensures。
于 2010-07-05T11:30:25.030 回答