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

2024-04-19

我还没有在 C# 6 中工作过,但想知道......

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

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

Or

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

编辑:有趣的例子本节已被删除,因为该示例所基于的所谓 volatileread 中存在错误。需要进一步调查


如果过滤器内抛出异常,那么该异常将被默默地吞掉,过滤器就会失败。这会导致原始异常下降catch情况或最终最终被向上提高。

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

您可以使用以下代码来验证这一点volatileread.com 的 C# 6 beta 解释器 http://volatileread.com/utilitylibrary/snippetcompiler:

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 块中。


Update

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何使用端口 1025-5000 作为临时端口来解决 WinXP 问题?

    如果您使用端口 0 而不是非零端口创建 TCP 客户端套接字 则操作系统会为您选择任何空闲的临时端口 大多数操作系统选择临时端口IANA 动态端口范围 http www iana org assignments port numbers49
  • 为什么这个游戏无法开始,它正在循环[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经检查了这段代码的每一寸 我无法找出是什么导致它进入循环 一旦我按下按键开始 它就会播放开始噪音 然后它会转到结束屏幕 并说按按键再次
  • 调用 GC.Collect 和 GC.WaitForPendingFinalizers 时会发生死锁吗?

    鉴于以下情况 GC Collect GC MaxGeneration GC WaitForPendingFinalizers GC Collect GC MaxGeneration 考虑到多线程和垃圾收集模式 什么情况下会出现死锁WaitF
  • (1U << X) 有什么作用?

    我找到了这段代码 enum IsDynamic 1U lt lt 0 IsSharable 1U lt lt 1 IsStrong 1U lt lt 2 什么是 1U lt lt X do 它设置位掩码 1U lt lt 0 1 1U lt
  • 如何在mongoengine中通过oid搜索文档

    我需要通过 oid 从 db 获取文档 例如 Docs objects id 4f4381f4e779897a2c000009 但如何做到这一点 如果 id 需要 ObjectId 对象 即使我尝试从 pymongo 设置 ObjectId
  • 时间计算类型不匹配

    我正在尝试计算seconds两个日期之间的差异保留两位小数 但是 每当我执行代码时 都会收到错误 13 类型不匹配 我在网上搜索并尝试了许多变体 但总是以类型不匹配而告终 我不知道如何解决这个问题 有人可以教我怎么做吗 INFO 最初使用的
  • 使用“make-series”运算符而不定义确切的日期范围

    我在用make series创建一个错误仪表板 以指定的时间间隔显示给定时间段内的事件 如下所示 make series dcount id default 0 on timestamp from ago 30d to now step 8
  • 使用 pyinstaller 在所有系统上保留字体

    我使用 tkinter 制作了一个 GUI 我用 pyinstaller 创建了 onefile exe 但设置的字体 font freesans ttf 不适用于其他计算机 我想我需要添加字体 但在与我类似的情况下 我不明白 pygame
  • 球体表面上测地线(最短距离路径)之间的交点

    我进行了广泛的搜索 但尚未找到该问题的合适答案 给定球体上的两条线 每条线由起点和终点定义 确定它们是否相交以及相交的位置 我找到了这个网站 http mathforum org library drmath view 62205 html
  • PowerShell 未启动

    由于某种原因 PowerShell 不再在我的计算机上打开 打开 PowerShell 会显示以下内容 但永远不会完成打开并且永远不会显示提示 Windows PowerShell Copyright C Microsoft Corpora
  • Android 模拟器上的 Mockito

    Android 新手尝试在 Android 中使用我最喜欢的 Java 测试工具 我正在尝试使用 Mockito 1 9 5 如以下博客文章中所述 但无法在我的模拟器上运行测试 我目前没有用于测试的物理设备 Mockit Android 教
  • Android 版百度地图:访问键无法用于位置搜索

    我正在为中国客户创建一个 Android 应用程序 他们需要地图集成 因此 Google 地图不是一个选择 因为所有 Google 服务在中国都被屏蔽 我正在尝试使用百度地图 它被称为百度LBS 基于位置的服务 云 获得没有叠加层的基本地图
  • GetMessage() 在主消息循环中会返回 -1 吗?

    根据获取消息API http msdn microsoft com en us library ms644936 28VS 85 29 aspx从 MSDN 库来看 出现错误时可能会返回 1 该文档提供了应避免的常见错误的代码片段 whil
  • Java:如何在 ScrollPane 视口上绘制非滚动覆盖?

    我想使用 ScrollPane 在其视口中显示图像 并且在图像上覆盖网格 或框 或任何其他类型的注册 位置标记 我需要覆盖层在滚动时保持固定 这意味着图像似乎在覆盖层 下方 移动 我将以固定速率滚动视口中的视图以提供平滑的运动 而叠加层将提
  • 在 JSX 中使用大括号声明 Const

    我刚刚开始使用 React Native 并习惯 JSX 语法 这就是我所说的吗 或者我在谈论 TypeScript 或者 ES6 反正 我见过这个 const foo this props 在类函数内部 大括号的用途是什么 使用它们和不使
  • 查找日历的第一天

    我想做的是创建一个简单的日历 我想找到特定月份第一周的第一天 我的日历是星期一 gt 星期日日历 以下代码可以工作 但正如您所看到的 它并不是那么好 任何人都对如何获取日历中的第一个日期有更好的想法 var now new DateTime
  • 如何让 wget 在网页索引文件的工作本地副本中包含日期和时间戳

    我有一份报告需要每天下载 我想每天下载一次该文件 并让该文件以 report date time html 结尾 示例代码 wget k p O C Users user Desktop New report date time html
  • 使用命令行查找数据文件的行数

    有一种常规方法 逐行读取并检查iostat每次读数时都会达到非零或负值 不过 我想打电话system command 例行公事和 使用wc l命令来计算数量 然后想要分配要放置数据的数组的维度 例如 我以两种方式打印行数 Program T
  • 在每个php脚本之前执行php脚本?

    除了将其放入所有 php 脚本之外 我如何在每个 php 脚本之前运行它 if SERVER REMOTE ADDR 123 123 123 123 SERVER REMOTE ADDR SERVER HTTP X REAL IP 我基本上
  • 如果 Exception 过滤器的过滤器抛出异常会发生什么

    我还没有在 C 6 中工作过 但想知道 正如标题所说 如果Exception过滤器的过滤器抛出异常会发生什么 我想真正的答案是 过滤器应该以永远不会抛出异常的方式编写 但我们可以说它确实如此 异常是否会发生在 catch 本身内部 try