c#重新抛出异常

本文关键字:抛出异常 | 更新日期: 2023-09-27 18:01:33

当在多个方法之间抛出异常时,所有方法都应该重新抛出异常吗?例如

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

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

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

c#重新抛出异常

您不需要在try块中包装所有内容。

当你想要catch某事时,你应该只try;在以下情况下,你应该只catch某事:

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

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

事实上,大多数时候你看到的try/catch块都是不正确的。你不应该捕捉异常,除非你能真正处理它们。捕获异常只是为了重新抛出它们是完全没有意义的(实际上被认为是不好的做法)。不要在try块中包装所有的代码。

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

请参阅我在这里的回答,了解更多细节和对"异常处理最佳实践"的全面讨论。