使用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外部执行程序
- 在交互控制台中运行相同的代码
虽然在本例中只是测试空值以避免该问题,但我想知道发生了什么以供将来参考,以防它在更复杂的情况下发生. 有没有人可以解释是什么原因导致异常在调试上下文中不被捕获,以及是否存在可以更改(或其他变通方法/解决方案)以避免将来出现该问题的(不推荐使用的)设置?