不带catch的throw new Exception和将其放入catch中的区别

本文关键字:catch 区别 throw new Exception 不带 | 更新日期: 2023-09-27 17:49:53

在写作上有什么不同(如果有的话):

if (File.Exists(filePath)) 
    //Something
else
    throw new FileNotFoundException();

并将上面的if/else块括在带有catch的try大括号中。

实际上,需要捕获吗?如果是这样,它会捕获什么?或者,更好的比较方法是将上面代码块的if部分放在try大括号中(没有if语句),并捕获一个FileNotFoundException,抛出调用堆栈(throw)。

谢谢

不带catch的throw new Exception和将其放入catch中的区别

我不认为有任何理由抛出一个无论如何都会抛出的异常。不过,抛出具有更高抽象级别的异常可能更有用。

用try catch包围if块意味着您将不得不在那里处理丢失的文件,然后在catch中处理(参见@lukas的回答)。如果要处理这段代码中丢失的文件,则不需要else-throw,因为从第一个If中已经知道文件丢失了。另一方面,如果您希望调用代码(在调用堆栈的更高位置)处理丢失的文件,那么在异常中传递该信息是可以的,但是您不希望在try-catch中包装抛出,因为它不会从该代码块中抛出。

一个比另一个更安全。

当你检查一个文件是否存在时,并不能保证该文件在方法执行后仍然存在。

如果您用Try / Catch块包围它,您可以优雅地捕获故障,相应地采取行动并在Finally块中包装任何您想要的东西。例如,关闭流到文件

是的,catch是必需的,因为存在竞争条件。其他进程/线程可以删除/更改/移动等。该文件。你不能阻止它。

try
{
  using (//your file opens here)
  {
  }
}
catch (FileNotFoundException)
{
  // handle FileNotFoundException
}

异常处理是应用程序关注的问题。如果您对(a)异常或(b)特定异常感兴趣,则使用try/catch。

由于异常处理比if检查慢很多个数量级,并且您知道文件可能不存在,那么您可以承受性能损失,或者按照自己的方式编写代码。这只是在文件不存在的情况下承受性能损失的选择。

有人说你应该只捕捉一个异常,如果你能做些什么,在主要情况下,他们是正确的,但是有一个特定的地方,我总是使用异常处理。

  • 当从服务返回时边界。有时这是安全相关(隐藏实现)细节),尽管主要是为了改进运行时诊断
  • 跨服务发出调用时边界。这通常是可靠性与此相关,但又很有帮助麻烦射击。

当使用异常处理进行诊断时,我基本上只是记录异常并引发备份。