代码之家  ›  专栏  ›  技术社区  ›  roundcrisis

代码在处理文件时会收缩使用模式

  •  4
  • roundcrisis  · 技术社区  · 16 年前

    我刚开始在.NET中使用代码契约,我有这样一个保护子句

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

    并用

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

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

    基本上,问题是:使用契约来确保I/O关注点(或外部/非单元关注点)是否存在问题?

    2 回复  |  直到 15 年前
        1
  •  6
  •   Hans Passant    16 年前

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

        2
  •  3
  •   Sjoerd    16 年前
    • 如果不确定文件是否存在,请不要使用异常。
    • 如果文件应该存在,但在某些特殊情况下可能不存在,请使用异常。
    • 如果您确定文件不存在是编程错误,请使用Contract.confirates。
    推荐文章