C#重新抛出异常

时间:2011-07-09 09:44:07

标签: c# .net exception

在多个方法之间抛出异常时,是否所有方法都重新抛出异常?例如

Method1()
{
   Method2();
}

Method2()
{
   try
   {
      // Do something
   }
   catch
   {
      throw;
   }
}

try
{
   Method1();
}
catch
{
   // Do something about exception that was thrown from Method2()
}

请注意Method1()如何,我不需要在Method2()块中包裹try,我应该这样做吗?

2 个答案:

答案 0 :(得分:9)

您无需将所有内容都包含在try块中。

如果您想try某事,您应该catch,而在以下情况下您应该只catch

  • 您已准备好处理异常(做任何需要做的事情,不要让它在堆栈中传播),
  • 您希望在重新抛出之前对异常执行某些操作(例如,记录它)(使用无参数形式的throw),
  • 您希望通过将其包装在您自己的另一个例外中来向异常添加详细信息(请参阅下面的Allon Guralnek的优秀评论)。

答案 1 :(得分:8)

您不需要尝试,捕获和重新抛出异常,除非您有一些特殊原因可以首先捕获它们。否则,它们将自动从较低级别的函数冒出来,这些函数将它们抛出到代码中的最高级别函数。从本质上讲,你可以把它们想象成一直“重新投入”,即使从技术上讲这不是正在发生的事情。

事实上,大多数情况下,您会看到写入try / catch块,但这是不正确的。 除非你能够真正处理它们,否则不应该捕获异常。为了重新抛出异常而捕获异常是完全没有意义的(实际上被认为是不好的做法)。不要将所有代码都包含在try块中。

请注意,通过“处理它们”,我的意思是catch块中的代码将根据尝试更正例外的特定异常采取某些特定操作条件。
例如,对于FileNotFoundException,您可能会通知用户无法找到该文件,并要求他们选择另一个文件。

有关详细信息和“异常处理最佳做法”的详尽讨论,请参阅my answer here