在使用网络/文件系统调用时如何防范异常(预防性维护)?

3

我有一个朋友在这件事上和我意见不同,我只是想得到一些反馈来确定谁在这种情况下是对和错。

FileInfo file = ...;

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

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

我的朋友指出的问题是,“如果我检查文件是否存在,那么即使文件存在又有什么用呢?因为无法防止在检查后文件被删除,而试图访问它会导致异常。所以,在事先检查存在性是否值得?”我能想到的唯一解释是,MSDN在他们的示例中明确地进行了检查,因此必须还有更多的原因。MSDN - FileInfo。但是,这确实让我想知道...额外的调用是否值得?

1
我基本上同意你朋友的观点。为了使代码更加健壮,你应该捕获异常,这样file.Exists就变得多余了。另一方面,如果我要处理大量文件,其中许多文件可能不存在,我可能会将file.Exists放在那里,以避免触发异常处理机制的开销。 - Daniel Pratt
请记住,即使没有抛出异常,任何异常块都不会影响性能成本,这是反对不使用异常处理的强有力论据,特别是在文件处理方面。否则,在检查和调用之间只需要毫秒级的时间差。 - Chad Harrison
3个回答

3
我在大部分情况下同意你的朋友的看法(具体取决于你是否在问题中隐瞒了重要信息)。这是一个例外情况,可能会发生在你的杰出代码之外。检查文件的存在并执行操作是一种竞争条件。
事实上,这个异常可能会发生,并且没有任何方法可以防止它。你必须捕获它。它完全超出了你的控制范围。例如,如果网络断开连接,闪电击中数据中心并引起火灾,或者松鼠咬断了电缆怎么办?虽然试图找出代码将引发异常的每一种方式不切实际,但在你知道可能会发生的情况下,尽力处理异常是一个好习惯。

3

我会同时使用if (file.Exists)try catch。只依靠异常处理不能明确地表达你的意图,而if (file.Exists)则可以自我解释。

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


0

我认为这取决于上下文。如果文件刚刚被创建,然后运行了这个进程,那么检查它是否存在就没有意义了。你可以假设它存在,因为代码仍在执行。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接