【问题标题】:Guarding against exceptions (preventative maintenance) when working with network / file system calls?在处理网络/文件系统调用时防止异常(预防性维护)?
【发布时间】:2012-02-08 01:15:22
【问题描述】:

我有一个朋友在这件事上与我意见相左,我只是想就在这种情况下谁对谁错得到一些反馈。

FileInfo file = ...;

if (file.Exists)
{
    //File somehow gets deleted

    //Attempt to do stuff with file...
}

我的朋友指出的问题是,“如果我检查是否存在文件存在怎么办?没有什么可以防止在检查后文件被删除并尝试访问它导致异常。那么,是否值得事先检查是否存在?"

我唯一能想到的就是 MSDN 清楚地检查了他们的示例,因此肯定还有更多内容。 MSDN - FileInfo。但是,它确实让我想知道......额外的电话是否值得?

【问题讨论】:

  • 我或多或少同意你朋友的观点。为了使代码健壮,您应该捕获异常,这使得file.Exists 位冗余。另一方面,如果我正在处理大量文件,其中许多文件可能不存在,我可能会在其中插入file.Exists 位以避免触发异常处理机制的开销。
  • 请记住,拥有任何没有抛出异常的异常块不会降低性能成本,这很难反对不使用异常处理,尤其是在文件的情况下。否则,您在检查和调用之间的时间是毫秒。

标签: c# exception filesystems filenotfoundexception


【解决方案1】:

我会同时拥有if (file.Exists)try catch。仅依靠异常处理并不能明确表达您的想法。 if (file.Exists) 不言自明。

如果有人在检查和处理文件之间的那一毫秒内删除了文件,您仍然会遇到异常。然而,还有其他条件可能导致异常: 文件是只读的;您没有请求的安全权限等等。

【讨论】:

    【解决方案2】:

    我在很大程度上同意你朋友的观点(上下文取决于你是否隐瞒了你的问题的相关信息)。这是一个可能在您的宏伟代码之外发生的异常示例。检查文件是否存在并执行您的操作是一种竞争条件。

    事实上,这种异常可能会发生,您无法采取任何措施来阻止它。你必须抓住它。它完全不受你的控制。例如,如果网络出现故障、闪电击中您的数据中心并着火,或者松鼠咀嚼电缆怎么办?虽然尝试找出代码引发异常的每一种方式是不切实际的,但在您知道这是一个很好的可能性并尽力处理它的情况下尽力而为是一种很好的做法。

    【讨论】:

      【解决方案3】:

      我会说这取决于上下文。如果文件是刚刚创建的,然后运行了这个过程,那么检查它是否存在是没有意义的。您可以假设它确实如此,因为代码仍在执行。

      但是,如果这是一个不断删除和创建的文件,那么在继续之前确保它存在确实是有意义的。

      另一个因素是谁/什么正在访问该文件。如果有多个客户端访问该文件,则该文件被修改/删除的可能性更大,因此检查该文件是否存在是有意义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多