Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:在不覆盖当前活动异常的情况下引发异常_C#_Exception_Mono - Fatal编程技术网

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:你是对的;我错过了。我认为除了你提到的黑客之外,这是不可能做到的。