使用网络/文件系统调用时防止exception(预防性维护)?

我有一个朋友在这方面与我意见不一致,我只想在这种情况下得到一些关于谁是对错的反馈。

FileInfo file = ...; if (file.Exists) { //File somehow gets deleted //Attempt to do stuff with file... } 

我的朋友指出的问题是,“那么当我检查存在时文件是否存在怎么办?没有什么可以防止在检查文件被删除后尝试访问它会导致exception的可能性。所以,是否值得在前检查存在?“

我能想到的唯一一件事就是MSDN清楚地检查了他们的例子,所以必须有更多。 MSDN – FileInfo 。 但是,它确实让我感到疑惑……额外的电话甚至值得吗?

我会同时拥有if (file.Exists)try catch 。 仅依赖exception处理并不明确表达您的想法。 if (file.Exists)是自我解释的。

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

我大部分时间都同意你的朋友(背景取决于你是否隐瞒了你问题中的相关信息)。 这是一个exception的例子,它可以在宏伟的代码之外发生。 检查文件是否存在并执行操作是竞争条件。

事实是,可能会发生此exception,并且您无法阻止它。 你必须抓住它。 这完全不受你的控制。 例如,如果网络发生故障,闪电击中您的数据中心并且它着火,或者松鼠通过电缆咀嚼,该怎么办? 虽然尝试找出代码引发exception的每种方式都是不切实际的,但在你知道它是一种很好的可能性并尽力处理它的情况下,最好尽量做到最好。

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

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

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