我一般应该使用"如果"或者"尝试"使用目录/文件时

时间:2015-02-17 06:24:32

标签: c# file directory

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

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

但是,如果我理解正确this,则建议允许仍然抛出异常,这意味着使用if而不是try.. catch使用if(Directory.Exists...

这是处理文件和目录时的一般方法,还是有时使用{{1}}或类似的东西?

注意:在看到第一个回复之后,只是想澄清一些目录/路径可能不存在的情况是预期和正常的行为。

2 个答案:

答案 0 :(得分:2)

你几乎总是必须捕获异常,尤其是I / O错误,在某处,以免程序在发生时被杀死。

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

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

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

(我会注意到,未被捕获且导致应用程序终止的异常通常会记录在系统事件日志中。因此,只要用户可以轻松地检查日志并从那里检索异常信息,那么就没有了。需要捕捉所有异常...只是那些你知道该怎么做的事。)

答案 1 :(得分:0)

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

如果路径无效并且您想要将其通知给用户,您可以选择返回成功值还是通过更适合您的代码体系结构的方式抛出异常。

在其他情况下,如果某些内容可能出现问题而用户不对其负责,或者需要通知,您通常会抛出异常并在相应位置的catch块中处理它们。

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

要问的问题是:

  • 无效状态会导致上面的整个操作失败吗?
  • 代码处理无效状态的位置和方式在哪里?
  • 代码"修复"无效状态并再次尝试?
  • 无效状态是源于用户错误还是代码问题?
  • 与验证检查的成本相比,操作的成本是多少?

修改:查看评论中的Yuval链接,以便更好地了解try-catch块的成本。

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