C#:在不覆盖当前活动异常的情况下引发异常
以下面的例子为例:C#:在不覆盖当前活动异常的情况下引发异常,c#,exception,mono,C#,Exception,Mono,以下面的例子为例: try { foo } finally { bar() } foo可以抛出也可以不抛出,而bar()可以抛出也可以不抛出。 如果两个函数都抛出异常,则bar()引发的异常将覆盖foo引发的异常。但是,我需要看到由foo引发的异常。我唯一能控制的代码是bar()内部的代码。 在C++中,这可以通过检查 STD::UNCUTHTUE异常内 BAL()/。 那么C#呢 有,但正如答案所说,这是一个可怕的黑客行为,在我的情况下,这是不够的,因为我的代码需要在Mono上运行,而Mon
try { foo }
finally { bar() }
foo
可以抛出也可以不抛出,而bar()
可以抛出也可以不抛出。
如果两个函数都抛出异常,则bar()
引发的异常将覆盖foo
引发的异常。但是,我需要看到由foo
引发的异常。我唯一能控制的代码是bar()内部的代码。
在C++中,这可以通过检查<代码> STD::UNCUTHTUE异常内<代码> BAL()/<代码>。
那么C#呢
有,但正如答案所说,这是一个可怕的黑客行为,在我的情况下,这是不够的,因为我的代码需要在Mono上运行,而Mono没有实现这个功能
背景:
在我的现实生活中,foo
是一大块代码,由库用户提供,可能引发各种异常,bar()
是一个Dispose
函数,由我提供并自动调用。您需要手动编写此代码:
// Whether an exception has been thrown from the main block.
bool hasMainException = false;
try
{
foo();
}
catch
{
// Record that exception has been thrown from main block, and rethrow.
hasMainException = true;
throw;
}
finally
{
// Execute secondary block within its own try-catch block.
try
{
bar();
}
catch
{
// Only rethrow exception from secondary block if there isn't
// already an exception from the main block.
if (!hasMainException)
throw;
}
}
顺便说一句,我需要实现一些与您的用例非常相似的东西,包括可以抛出的Dispose
方法,因此我编写了一些扩展方法来实现这一点,以及支持所有用例的各种策略。见和。您感兴趣的策略是。这将
- 从
foo
抛出异常,即使在栏中抛出异常也是如此
- 如果
foo
中没有异常,则从bar
引发异常
- 如果没有抛出异常,则不抛出任何内容
- 保留原始stacktrace不受任何异常的影响
ExceptionDispatchInfo exceptionInfo = null;
try
{
foo();
}
catch(Exception ex)
{
exceptionInfo = ExceptionDispatchInfo.Capture(ex);
}
finally
{
try
{
bar();
}
catch(Exception ex)
{
exceptionInfo = exceptionInfo ?? ExceptionDispatchInfo.Capture(ex);
}
}
exceptionInfo?.Throw();
由于您可以在栏中控制代码
将其包装在try/catch块中,因此在外部您将只看到foo
引发的异常。正如我所写的,不幸的是,我唯一可以控制的代码是栏()内的代码
,其他一切都是库用户的责任…@mic_e:你是对的;我错过了。我认为除了你提到的黑客之外,这是不可能做到的。