内容简介:在 .NET Framework 4.8 中,try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃。而 .NET Core 3.0 中不会出现这样的问题。本文可能是正在像微软报告的一个 Bug。This post is written in
在 .NET Framework 4.8 中,try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃。而 .NET Core 3.0 中不会出现这样的问题。
本文可能是正在像微软报告的一个 Bug。
This post is written in multiple languages . Please select yours:
官方文档中 when 的行为
你可以前往官方文档:
在其中,你可以找到这样一段话:
用户筛选的子句的表达式不受任何限制。 如果在执行用户筛选的表达式期间发生异常,则将放弃该异常,并视筛选表达式的值为 false。 在这种情况下,公共语言运行时继续搜索当前异常的处理程序。
即当 when
块中出现异常时, when
表达式将视为值为 false
,并且此异常将被忽略。
示例程序
鉴于官方文档中的描述,我们可以编写一些示例程序来验证这样的行为。
using System; using System.IO; namespace Walterlv.Demo.CatchWhenCrash { internal class Program { private static void Main(string[] args) { try { try { Console.WriteLine("Try"); throw new FileNotFoundException(); } catch (FileNotFoundException ex) when (ex.FileName.EndsWith(".png")) { Console.WriteLine("Catch 1"); } catch (FileNotFoundException) { Console.WriteLine("Catch 2"); } } catch (Exception) { Console.WriteLine("Catch 3"); } Console.WriteLine("End"); } } }
很显然,我们直接 new
出来的 FileNotFoundException
的 FileName
属性会保持为 null
。对其解引用会产生 NullReferenceException
。很显然代码不应该这么写,但可以用来验证 catch
- when
语句的行为。
按照官网描述,输出应该为 Try
- Catch 2
- End
。因为 when
中的异常被忽略,因此不会进入到外层的 catch
块中;因为 when
中出现异常导致表达式值视为 false
,因此进入了更合适的异常处理块 Catch 2
中。
在 .NET Core 3.0 中的行为和 .NET Framework 4.8 中的行为
下面两张图分别是这段代码在 .NET Core 3.0 和 .NET Framework 4.8 中的输出:
可以注意到,只有 .NET Core 3.0 中的行为符合官方文档的描述,而 .NET Framework 4.8 中甚至连 End
都没有输出!几乎可以确定,程序在 .NET Framework 4.8 中出现了致命的崩溃!
如果我们以 Visual Studio 调试启动此程序,可以看到抛出了 CLR 异常:
以下是在 Visual Studio 中单步跟踪的步骤:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员2010精华本
程序员杂志社 / 电子工业 / 2011-1 / 49.00元
《程序员(2010精华本)》主要内容:《程序员》创刊10年来,每年末编辑部精心打造的“合订本”已经形成一个品牌,得到广大读者的认可和喜爱。今年,《程序员》杂志内容再次进行了优化整合,除了每期推出的一个大型专题策划,各版块也纷纷以专题、策划的形式,将每月的重点进行了整合,让内容非常具有凝聚力,如专题篇、人物篇、实践篇等。另外杂志的版式、色彩方面也有了很大的飞跃,给读者带来耳目一新的阅读体验。一起来看看 《程序员2010精华本》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
随机密码生成器
多种字符组合密码