C#如何从外部捕获重新引发异常



我已经阅读了如何在C#中重新抛出InnerException而不丢失堆栈跟踪?这里的答案可能是相同的;另一方面,我的情况完全不同,有人可能会提出更好的方法。

我的简化结构是

try {
something();
} catch (MyException e1) {
try {
somethingElse();
} catch (MyException e2) {
throw e1;
}
}

也就是说,调用somethingElse()是试图从原始异常中恢复,如果恢复尝试失败,我想抛出原始异常,而不是恢复尝试中出现的异常。

我从编译器那里得到了一个关于重新抛出丢失堆栈跟踪的异常的警告(当然,我不喜欢在代码中留下警告条件(。但是我该怎么办呢?我的IDE(Rider(建议将throw e1;更改为throw;,但这可能会重新考虑e2

除了所引用的内部例外问题中提出的复杂想法之外,还有什么解决方案吗?

老实说,我真的不在乎不完美的堆栈跟踪——我只想去掉警告。

没有办法从外部catch块到内部catch块重新抛出异常。实现这种模式的最佳方法是注意内部操作是否成功:

try {
something();
} catch (MyException e1) {
bool recovered=false;
try {
somethingElse();
recovered=true;
} catch {

}
if (!recovered) {
throw;
}
}

存在ExceptionDispatchInfo类。

这使您可以在不更改堆栈跟踪的情况下捕获异常并重新抛出:

public static void Method()
{
try
{
Something();
}
catch (MyException e1)
{
try
{
SomethingElse();
}
catch (MyException)
{
//throw e1;
ExceptionDispatchInfo.Capture(e1).Throw();
throw;
}
}
}

.Throw()行之后的常规throw;是因为编译器不知道.Throw()总是抛出异常。投将永远不会被调用,但至少如果您的方法需要返回对象或是异步函数,编译器不会抱怨。

原始后链接

最新更新