尝试捕获并重新抛出异常
本文关键字:抛出异常 | 更新日期: 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应用程序,如果可能,请恢复到已知状态。