抛出新的Exception与没有周围捕获并将其放入捕获之间的区别?

时间:2011-04-11 23:21:25

标签: c# exception exception-handling

书面形式有何不同(如果有的话):

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

在上面的if / else块周围,在带有catch的try撑杆中。

事实上,需要捕获的是什么?如果是这样,会有什么影响?或者更好的比较是将上面块的if部分放在try括号中(不带if语句)并捕获FileNotFoundException,抛出调用堆栈(throw)。

由于

5 个答案:

答案 0 :(得分:1)

我认为没有任何理由抛出会被抛出的异常。但是,抛出具有更高抽象级别的异常可能更有用。

答案 1 :(得分:0)

一个比另一个更安全。

当您检查文件是否存在时,没有任何东西可以保证文件在执行该方法时更进一步。

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

答案 2 :(得分:0)

异常处理是一个应用程序问题。如果您对(a)异常或(b)特定异常感兴趣,那么您可以使用try / catches。

由于异常处理比if检查要慢许多个数量级,并且您知道该文件可能不存在,因此您可以获得性能损失,也可以按原样编写代码。在文件不存在的情况下,它只是你选择性能命中。

有人说如果你可以做一些事情,你应该只捕获一个例外,并且在主要情况下它们是正确的但是有一个地方我总是使用异常处理。

  • 从服务中返回时 边界。有时这是安全 相关(隐藏实施 细节)虽然大多是改善 运行时诊断
  • 跨服务发出呼叫 边界。这通常是可靠性的 有关,虽然再次大多数是援助 故障排除。

当使用异常处理进行诊断时,我基本上只记录异常并重新启动。

答案 3 :(得分:0)

是的,由于种族条件,需要抓住。其他进程/线程可以删除/更改/移动/等。文件。你无法阻止它。

try
{
  using (//your file opens here)
  {

  }
}
catch (FileNotFoundException)
{
  // handle FileNotFoundException
}

答案 4 :(得分:0)

通过try catch包围if块意味着你将不得不在那里处理丢失的文件然后在catch中(参见@lukas的答案)。如果您要在此代码中处理丢失的文件,那么您不需要else-throw,因为您已经知道第一个if中缺少该文件。另一方面,如果你想要调用代码(在调用堆栈的某个位置上方)来处理丢失的文件,那么在异常中传递该信息是可以的,但你不想再将其包装起来try-catch因为它不会被抛出这段代码。