尝试捕获并重新抛出异常

时间:2013-09-27 18:22:01

标签: c# exception try-catch rethrow

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

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

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

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

4 个答案:

答案 0 :(得分:10)

考虑这两个模型:

1-重新 - throwing ex

catch(Exception ex)
{
    throw ex;
}
你失去了StackTrace。如果在某处记录exception,则包含调用堆栈的直接帧的StackTrace(方法调用的历史记录)将丢失。

2-对比throw

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

你保持StackTrace。您可以执行其他处理,然后重新抛出exception而不会丢失跟踪字符串。

答案 1 :(得分:4)

它继续将异常抛出调用堆栈。这段代码所做的一件事与你没有捕获异常有什么不同,它会将异常位置(调用堆栈,行#等)重置到你重新抛出异常的地方,所以你不会有原始异常被抛出的位置。

如果您不打算在catch区块中实际执行某些操作,我建议您不要使用throw而不是throw ex进行重新投掷。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

  

它是否陷入无限投掷/捕获   环?或者它最终会离开try catch?

没有。是。

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

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

默认情况下,某些内容是意外的,应该记录并且应该停止应用程序 - 放弃页面或winforms应用程序,如果可能,还原为已知状态。