如果Exception过滤器的过滤器抛出异常会发生什么

Mur*_*ock 24 c# c#-6.0

我还没有在C#6工作但是想知道....

正如标题所说"如果Exception过滤器的过滤器抛出异常会发生什么?".我想真正的答案是"过滤器应该以一种永远不会抛出异常的方式编写."但是我们可以这样说.是否异常发生在捕获本身内?

try
{
  throw new Exception("Forced Exception");
}
catch (Exception ex) if (MethodThatThrowsAnException())
{
  WriteLine("Filtered handler 1");
}
catch (Exception ex)
{
  WriteLine("Filtered handler 2");
}
Run Code Online (Sandbox Code Playgroud)

要么

try
{
  throw new Exception("Forced Exception");
}
catch (Exception ex) if (MethodThatThrowsAnException())
{
  WriteLine("Filtered handler 1");
}
Run Code Online (Sandbox Code Playgroud)

编辑:有趣的示例 由于示例所基于的涉嫌volatileread的错误,此部分已被删除.需要进一步调查

pok*_*oke 14

如果在过滤器中抛出异常,则会以静默方式吞下该异常,并且过滤器将失败.这导致原始例外情况下降catch或最终被重新加速.

因此调用过滤器的代码无法知道过滤器方法中实际存在异常.因此,避免出现异常的情况非常重要,以确保过滤器不会因此而失败.

您可以使用volatileread.com的C#6 beta解释器上的以下代码进行验证:

public void Main ()
{
    try
    {
        try
        {
            throw new Exception("Original exception");
        }
        catch (Exception ex)
            when (Test()) // `if (Test())` in older previews
        {
            Console.WriteLine("Caught the exception");
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}

public static bool Test ()
{
    throw new Exception("Exception in filter condition");
}
Run Code Online (Sandbox Code Playgroud)

这导致外部try/catch块中出现"原始异常".


更新

由于我在不使用外部try/catch块时不理解volatileread编译器的输出,我自己安装了MS Build Tools 2015(截至本答复的时候还if没有使用,而不是when)并尝试了它.事实证明,当不使用外部try/catch时,"原始异常"仍然是导致程序崩溃的原因.所以这不是过滤器异常.这似乎是volatile编译器的一个错误.