我还没有在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编译器的一个错误.
| 归档时间: |
|
| 查看次数: |
1822 次 |
| 最近记录: |