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

标签 c# c#-6.0

我还没有使用过 C# 6,但我想知道......

正如标题所说“如果 Exception 过滤器的过滤器抛出异常会发生什么?”。我想真正的答案是“过滤器应该以永远不会抛出异常的方式编写。”,但可以说它确实如此。会不会好像异常发生在捕获本身内部?

try
{
  throw new Exception("Forced Exception");
}
catch (Exception ex) when (MethodThatThrowsAnException())
{
  WriteLine("Filtered handler 1");
}
catch (Exception ex)
{
  WriteLine("Filtered handler 2");
}

或者

try
{
  throw new Exception("Forced Exception");
}
catch (Exception ex) when (MethodThatThrowsAnException())
{
  WriteLine("Filtered handler 1");
}

编辑:有趣的例子 由于该示例所基于的涉嫌 volatileread 中存在错误,因此删除了该部分。需要进一步调查

最佳答案

如果过滤器中抛出一个异常,那么该异常将被默默地吞掉,过滤器就会失败。这会导致原始异常在 catch 情况下下降或最终向上重新引发。

因此调用过滤器的代码将无法知道您的过滤器方法中实际上存在异常。因此,重要的是要避免可能引发异常的情况,以确保过滤器不会因此而失败。

您可以在 volatileread.com’s C# 6 beta interpreter 上使用以下代码验证这一点:

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");
}

这导致 “原始异常” 出现在外部 try/catch block 中。


更新

由于在不使用外部 try/catch block 时我无法理解 volatileread 编译器的输出,因此我自己安装了 MS Build Tools 2015(截至本回答时仍使用 if,而不是 when) 并进行了尝试。事实证明,当不使用外层的try/catch时,“原始异常”仍然是导致程序崩溃的异常。所以这不是过滤器异常。这似乎是 volatile 编译器的错误。

关于c# - 如果 Exception 过滤器的过滤器抛出异常会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28879320/

相关文章:

c# - 为什么 ICollection<>.Contains 会忽略我重写的 Equals 和 IEquatable<> 接口(interface)?

c# - 使用表达式树为新类创建 Lambda 表达式选择器

c#-6.0 - 为什么在C#6中删除声明表达式?

c# - 通过方法创建具有通用 csv 阅读器的类

c# - 领域类应该如何设计?

javascript - 从动态表中获取每个单元格的值

c# - Entity Framework 问题: How to handle errored column

c# - Xaml 和事件不起作用

c# - 具有私有(private) setter 的属性与仅获取属性

c# - 多个解决方案引用的项目的 Nu-Get 和项目级别依赖性问题