C# 在处理网络/文件系统调用时防止异常(预防性维护)?

C# 在处理网络/文件系统调用时防止异常(预防性维护)?,c#,exception,filesystems,filenotfoundexception,C#,Exception,Filesystems,Filenotfoundexception,我有一个朋友在这个问题上与我意见相左,我只是想得到一些反馈,看看在这种情况下谁是对的,谁是错的 FileInfo file = ...; if (file.Exists) { //File somehow gets deleted //Attempt to do stuff with file... } 我朋友指出的问题是,“那么,当我检查文件是否存在时,如果该文件存在,该怎么办?没有什么可以防止在检查后文件立即被删除并试图访问该文件会导致异常。那么,是否值得事先检查文件是

我有一个朋友在这个问题上与我意见相左,我只是想得到一些反馈,看看在这种情况下谁是对的,谁是错的

FileInfo file = ...;

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

    //Attempt to do stuff with file...
}
我朋友指出的问题是,“那么,当我检查文件是否存在时,如果该文件存在,该怎么办?没有什么可以防止在检查后文件立即被删除并试图访问该文件会导致异常。那么,是否值得事先检查文件是否存在?”


我能想到的唯一一件事是,MSDN在他们的示例中明确地进行了检查,因此肯定还有更多内容。但是,它确实让我想知道。。。这个额外的电话值得吗?

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

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


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

我在很大程度上同意您的朋友的意见(上下文取决于您是否从问题中保留了相关信息)。这是一个异常的例子,可能发生在您的代码之外。检查文件是否存在并执行操作是竞争条件


事实上,这种异常可能会发生,您无法阻止它。你必须抓住它。这完全超出你的控制。例如,如果网络瘫痪,闪电击中数据中心,数据中心起火,或者松鼠咬断电缆,该怎么办?虽然试图找出代码引发异常的每一种方式并不实际,但在您知道这是一种很好的可能性的情况下尽最大努力并尽最大努力处理它是一种很好的做法。

如果(file.Exists)我会同时拥有
try catch
。仅依赖异常处理并不能明确表达您的想法<代码>如果(file.Exists)
是自我解释的


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

我或多或少同意您的朋友的意见。为了使代码健壮,您应该捕获异常,这使得
文件.Exists
位冗余。另一方面,如果我正在处理大量文件,其中许多文件可能不存在,我可能会将
file.Exists
位粘贴在其中,以避免触发异常处理机制的开销。请记住,没有抛出异常的异常块不会降低性能,这很难反对不使用异常处理,尤其是在文件的情况下。否则,您将在检查和呼叫之间以毫秒为单位进行通话。