【问题标题】:C# Re-throwing ExceptionsC# 重新抛出异常
【发布时间】:2011-07-09 09:44:06
【问题描述】:

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

Method1()
{
   Method2();
}

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

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

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

【问题讨论】:

    标签: c# .net exception


    【解决方案1】:

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

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

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

    【讨论】:

    • +1:简洁准确。我还要添加一个不完全是“重新抛出”的原因-将异常包装在另一个异常中(但始终将原始异常保留在 InnerException 中,否则您会丢失有关可能有助于调试的原始异常的信息)。包装可以提供重新抛出无法提供的额外上下文,例如“未能为客户 843 保存新订单,详情请参阅 InnerException。”。
    【解决方案2】:

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

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

    请注意,“处理它们”是指catch 块中的代码将根据抛出的特定异常采取一些特定的操作,以尝试纠正异常情况。
    例如,对于FileNotFoundException,您可能会通知用户找不到该文件并要求他们选择另一个文件。

    请参阅my answer here 了解更多详细信息以及对“异常处理最佳实践”的全面讨论。

    【讨论】:

    • 据我所知,写catch(Exception ex) 是一种不好的做法,最好捕获一些特定的错误,如ArgumentNullException 或类似的东西?为什么是这样?还有一件事是为什么每个人都在 catch 语句的末尾加上throw;?为什么要再次抛出异常?因为一些更高的处理程序应该捕获并处理他?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2011-01-22
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    相关资源
    最近更新 更多