使用System.Text.Json库,我有一个JsonNode,从中提取一些数据,这些数据可能为空,也可能不为空.目前,我已经将代码包装在try-Catch块中,而不是测试每个元素是否为空,但我注意到当其中一个元素为空时,代码会出现一些看似奇怪的行为:尽管Catch块中包含了该异常(或者当Catch块被设置为处理异常本身时),但只有在使用IDE(Visual Studio 2019)的S调试器时,代码将崩溃并引发"NullReferenceException".

用于重现行为的伪代码:

using System.Text.Json;
using System.Text.Json.Nodes;
...

string s = "{\"People\":[{\"Name\":\"Bob\",\"Age\":60},{\"Name\":\"Carl\",\"Age\":null}]}";
JsonNode n = JsonNode.Parse(s)["People"];
try { n[1]["Age"].ToJsonString(); } catch (Exception ex) { MessageBox.Show($"Caught Exception {ex.Message}"); }

如果我运行调试器,则在到达该行时,执行将中断为NullReferenceException. 如果我执行以下任一操作,则会成功捕获异常:

  • 在启用"使用托管兼容性模式"设置的情况下运行调试器
  • 在IDE外部执行程序
  • 在交互控制台中运行相同的代码

虽然在本例中只是测试空值以避免该问题,但我想知道发生了什么以供将来参考,以防它在更复杂的情况下发生. 有没有人可以解释是什么原因导致异常在调试上下文中不被捕获,以及是否存在可以更改(或其他变通方法/解决方案)以避免将来出现该问题的(不推荐使用的)设置?

推荐答案

快速注意:当VS在您的异常期间中断时,您只需点击Run(或F5)继续,处理程序将照常被触发.

在VS中调试时,有许多异常被设置为"抛出时中断".有几种方法可以禁用它们.

  1. 在异常弹出窗口中,展开对话框中的小"异常设置"部分.它应该为您提供禁用"抛出此异常类型时中断"的选项.

  2. You can bring up the full list in the Exception Settings window: Debug > Windows > Exception Settings.
    Under "Common Language Runtime Exceptions" there should be a number of items ticked, including System.NullReferenceException in your system (unless you disabled it with the previous method). Feel free to un-tick the ones you don't want, or tick the ones you want VS to forcibly break on (to give you a chance to analyse the code when they're thrown).

Csharp相关问答推荐

Blazor:计算值或保留为默认值

并行令牌更新

如何使用while循环实现异常处理

如何删除文件的基础上嵌入的时间戳嵌入文件名

Blazor-从数据库内部服务器提取错误

C#方法从AJAX调用接收NULL

为什么我的表单在绑定到对象时提交空值?

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

System.Text.Json .NET 8多形态语法化

从VS调试器而不是测试资源管理器运行的调试NUnitDotNet测试

DateTime ToString()未以指定格式打印

带有列表参数的表达式树

VS 2022与VS 2019:如何/为什么创建额外的任务?

具有类型识别的泛型方法

Blazor Server.NET 8中的Blazore.FluentValidation问题

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

MSI无法将快捷方式添加到启动文件夹

在同一个捕获中可以有多种类型的异常吗?

如何在ASP.NET Core 8中获取键控服务词典

获取应用程序版本信息时出现奇怪信息