在使用 directories/files 时,我通常应该使用 "if" 还是 "try"

Should I generally use "if" or "try" when working with directories/files

通常,当我处理文件和目录时,我想检查目录或文件的路径是否存在,我只是使用类似的东西:

if (Directory.Exists(path))
{
     //Something...
}

不过,如果我理解this回答正确,建议允许异常仍然抛出,意思是不要使用if,而是使用try.. catch.

这是处理文件和目录时的通用方法,还是有时使用 if(Directory.Exists... 或类似的东西更可取?

注意:在看到第一个回复后,只是想澄清一下某些 directory/path 可能不存在的情况是预期的正常行为。

100% 取决于您想要达到的目标。

如果路径无效并且您想将其通知给用户,您可以选择返回成功值或抛出更适合您的代码架构的异常。

在其他情况下,如果出现问题而用户无需对此负责或需要通知,您通常会抛出异常并在适当位置的 catch 块中处理它们。

要记住的是,您始终可以执行 if 检查并在出现无效状态时抛出您自己的异常,而不是让无效状态自己引发异常。主要区别在于抛出异常的数据(堆栈跟踪、消息等),但也可以表现在性能上(如果您可以先执行低成本操作,您就不会想尝试高成本操作检查以确保它会成功)。 Try-catch 块也会增加一点开销,但我认为这并不重要。

要问的问题是:

  • 无效状态是否会导致上面的整个操作失败?
  • 代码在哪里以及如何处理无效状态?
  • 代码是否"fix"无效状态并重试?
  • 无效状态是由用户错误还是代码问题引起的?
  • 与验证检查的成本相比,操作的成本如何?

编辑: 在评论中查看 Yuval 的 link 以更好地了解 try-catch 块的成本。

验证检查的成本几乎总是很低,所以最后我要说的是:执行检查,即使您打算在无效状态的情况下抛出自己的异常。

您几乎总是 必须在某处捕获异常,尤其是 I/O 错误,以免程序在发生时被简单地终止。

在许多情况下,首先检查有效输入(例如Directory.Exists())是有意义的。这使您能够以用户友好的方式高效地报告和响应明显的用户错误场景。

但是您不能保证在您执行该调用和您尝试以某种方式访问​​它的时间之间该目录不会被删除。或者,如果目录位于远程共享上,则网络不会出现故障。或者你不会有其他类型的 I/O 错误。

有一些不值得捕捉的例外。例如意外的 OutOfMemoryException(与某些数据结构变得太大相反)或其他类型的内部 .NET 故障。从这些类型的错误中恢复的可能性很小。但是对于其他任何事情,您在某个时候应该捕获可能发生的异常。有时这只是意味着顶级 catch (Exception e),您将在干净退出程序之前以某种方式记录异常。

(我会注意到未捕获并导致应用程序终止的异常通常会记录在系统事件日志中。所以只要用户愿意检查日志并从那里检索异常信息,那么没有必要捕获所有异常……只捕获那些您知道如何处理的异常。