【问题标题】:Try catch and re-throw exception尝试捕获并重新抛出异常
【发布时间】:2013-10-04 03:40:00
【问题描述】:

前几天我在我们的一个项目中看到了一些代码,它使用 try catch 并重新抛出捕获的异常,如下所示:

try
{
    exceptionProneCode();
}
catch(Exception ex)
{
    throw ex;
}

catch 块中的异常没有做任何其他事情,所以我什至不确定它为什么会被重新抛出。我看不出实际上再次抛出相同的异常并且对异常什么都不做有什么好处。

如果重新抛出在 catch 块中捕获的异常,C# 是如何处理的?它会陷入无限的抛出/捕获循环吗?还是它最终会离开 try catch?

【问题讨论】:

  • 有没有可能finallycatch?也许有人出于习惯不小心包含了catch? (可以希望)一个可能的好处是逐步调试可以打破捕获(不提倡!我可能会用额外的数据包装并重新抛出新链。)
  • 不,catch 中不包含 finally。我只是不完全理解为什么要重新抛出捕获的异常。我现在对此有了更好的了解。
  • 我怀疑这样做是为了可以放置一个断点来查看异常。这是一个可能的优势,而丢失堆栈跟踪通常不是优势。正如其他人所指出的,应该使用 throw 而不是 throw ex(常见错误)。

标签: c# exception try-catch rethrow


【解决方案1】:

考虑这两个模型:

1- 由 re-throwing ex:

catch(Exception ex)
{
    throw ex;
}

你松了StackTrace。如果exception 记录在某处,则包含调用堆栈的即时帧(方法调用历史)的StackTrace 将丢失。

2- 对比throw:

catch(Exception ex)
{
    // do something here
    throw;
}

您维护StackTrace。您可以进行额外处理,然后重新抛出exception,而不会丢失跟踪字符串。

【讨论】:

  • 虽然所有这些都是真实且有用的,但我不确定这是如何解决问题的。
  • @vcsjones 没有人可以 100% 确定开发人员通过查看他的代码真正想要做什么。在这里,我试图解释他这样编码的最可能原因之一。由 OP 来推断:)
  • 我正在尝试追查我们的一个项目中的一个错误,并想了解异常如何在调用堆栈中传播。这很有帮助!谢谢!
  • @CameronTinker 很高兴为您提供帮助!
  • 一种常见的情况是,如果您要对异常进行包装并将原始异常作为 InnerException throw new MyCustomException("Some useful information", ex); 抛出
【解决方案2】:

它继续在调用堆栈中抛出异常。这段代码所做的一件事与您没有捕获异常不同,它会将异常位置(调用堆栈、行号等)重置为您重新抛出异常的位置,因此您不会具有引发原始异常的位置。

如果您不打算在 catch 块中实际执行某些操作,我建议您不要捕获,或者至少使用 throw 而不是 throw ex 重新抛出。

【讨论】:

    【解决方案3】:

    它向调用者抛出异常。但它在这里处理它,因此它不会引发未处理的异常。但是,老实说,我没有看到这样做的好处。让它抛出异常。为什么?因为只有在其上方的整个调用堆栈没有try ... catch 时,异常才会未处理。这没有任何用处。

    【讨论】:

    • 如果调用者未能处理异常,它仍然是一个未处理的异常。
    【解决方案4】:

    它是否卡在无限的投掷/接球中 环形?还是它最终会离开 try catch?

    没有。是的。

    正如其他人所指出的那样,该代码没有任何好处,而且对调试有害。

    一个好的 catch 块将捕获一个特定的预期问题并记录并继续(问题并不表明应用程序状态已损坏)、记录并暂停(因为应用程序现在处于未知状态并且继续可能会造成更大的危害),做其他事情(例如回退到等效的技术/算法),等待再试一次。

    默认情况是出现意外情况,应该记录并停止应用程序——放弃页面或者如果是 winforms 应用程序,尽可能恢复到已知状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2011-06-27
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多