C#重新抛出异常

Sco*_*ott 6 .net c# exception

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

Method1()
{
   Method2();
}

Method2()
{
   try
   {
      // Do something
   }
   catch
   {
      throw;
   }
}
Run Code Online (Sandbox Code Playgroud)
try
{
   Method1();
}
catch
{
   // Do something about exception that was thrown from Method2()
}
Run Code Online (Sandbox Code Playgroud)

请注意,在Method1(),我也没必要换Method2()一个try块,我应该是什么?

Fré*_*idi 9

您不需要将所有内容都包装在try块中.

你应该只try在你想要的catch东西时,你应该只catch在以下情况下:

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

  • +1:简洁准确.我还要添加另一个不完全"重新抛出"的原因 - 在异常中包装异常(但始终在InnerException中保留原始异常,否则会丢失有关原始异常的信息,这有助于调试).包装可以提供额外的上下文,重新抛出不能,例如"无法为客户843保存新订单,请参阅InnerException以获取详细信息.". (3认同)

Cod*_*ray 8

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

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

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

有关详细信息和"异常处理最佳实践"的详尽讨论,请参阅我的答案.