1

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

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

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

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

4

4 回答 4

10

考虑这两个模型:

1- 通过重新throwing ex

catch(Exception ex)
{
    throw ex;
}

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

2- 相比之下throw

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

你维护StackTraceexception您可以进行额外的处理,然后在不丢失跟踪字符串的情况下重新抛出。

于 2013-09-27T18:24:27.817 回答
4

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

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

于 2013-09-27T18:25:28.543 回答
2

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

于 2013-09-27T18:24:00.003 回答
1

它会陷入无限的抛出/捕获循环吗?或者它最终会离开 try catch 吗?

不,是的。

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

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

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

于 2013-09-27T18:31:38.397 回答