Json 空引用异常仅在调试器中忽略 try-catch 块,但在其他上下文中捕获良好

问题描述 投票:0回答:1

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

重现行为的虚拟代码:

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之外执行程序
  • 在交互式控制台中运行相同的代码

虽然仅测试 null 可以避免这种情况下的问题,但我想知道发生了什么,以供将来参考,以防在更复杂的情况下发生。 有谁能解释一下导致调试上下文中未捕获异常的原因,以及是否存在可以更改的(未弃用的)设置(或其他解决方法/解决方案)以避免将来出现问题?

c# json visual-studio exception visual-studio-debugging
1个回答
0
投票

快速说明:当 VS 在异常期间中断时,您只需按“运行”(或 F5)即可继续,处理程序将正常触发。

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

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

  2. 您可以在异常设置窗口中调出完整列表:调试 > 窗口 > 异常设置
    在“公共语言运行时例外”下,应该勾选许多项目,包括系统中的

    System.NullReferenceException
    (除非您使用之前的方法禁用了它)。您可以随意取消勾选您不需要的那些,或者勾选您希望 VS 强制中断的那些(以便您有机会在抛出它们时分析代码)。

© www.soinside.com 2019 - 2024. All rights reserved.