尝试捕获并重新抛出异常

本文关键字:抛出异常 | 更新日期: 2023-09-27 18:33:15

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

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

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

如果重新引发在 catch 块中捕获的异常,C# 如何处理此问题?它是否陷入无限的投掷/接球循环?还是最终会留下尝试捕获?

尝试捕获并重新抛出异常

考虑以下两个模型:

1- 通过重新throwing ex

catch(Exception ex)
{
    throw ex;
}

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

2-对比throw

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

你维护StackTrace.您可以执行其他处理,然后重新引发exception而不会丢失跟踪字符串。

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

如果你不打算在 catch 块中实际做某事,我建议不要接球,或者至少只用一个throw而不是throw ex重新抛出。

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

它是否卡在无限投掷/接球中 圈?还是最终会留下尝试捕获?

不。是的。

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

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

默认情况下,某些内容是意外的,应记录并停止应用程序 - 放弃页面,或者如果Winforms应用程序,如果可能,请恢复到已知状态。