c# - 你能捕捉到抛出 NullReferenceException 的对象的名称吗?
问题描述
有没有办法找出是什么特定对象引起的NullReferenceException
?我已经阅读了关于故障排除NullReferenceException
的页面,它谈到了在调试器中检查变量并查看异常消息。
如果在生产代码中引发了异常,因此您无法运行调试器来检查变量怎么办?异常消息显示堆栈跟踪,因此您可以查看引发异常的方法,但它没有说明是哪个特定对象null
。
我希望能够将作为错误消息的对象的名称添加null
到错误消息中,这样当我查看来自用户的报告并遇到 时NullReferenceException
,我可以轻松查看对象是什么null
并修复它。有谁知道这样做的方法?
我还发现了这个问题,它问了同样的问题,但它是从 2011 年开始的,我不知道从那时起是否有任何变化。
编辑:这被标记为重复的问题确实是重复的,但也很老(2008)。从那以后有什么改变吗?
编辑2:我在谷歌搜索这个问题时发现了这个。Visual Studio 可以告诉你是什么扔了NullReferenceException
; 有没有办法利用它来将它添加到日志文件中?
解决方案
考虑到堆栈跟踪,应该相对容易弄清楚,但更好的方法是在代码中包含“验证”或参数和/或空检查,并ArgumentNullException
在尝试访问可能的变量成员之前显式抛出自己not 已被初始化。然后,您可以提供未初始化对象的名称:
if (obj == null)
throw new ArgumentNullException(nameof(obj));
对构造函数和方法中的参数执行这些检查是一种常见的做法,例如:
public void SomeMethod(SomeType someArgument)
{
if (someArgument == null)
throw new ArgumentNullException(nameof(someArgument));
//you will never get there if someArgument is null...
var someThing = someArgument.SomeMember;
if (someThing == null)
throw new ArgumentException("SomeMember cannot be null.", nameof(someArgument));
...
}
推荐阅读
- php - TypeError:在未使用 $.post() 方法实现接口 FormData 错误的对象上调用了“附加”
- python - 如何使用具有相同范围的 2 个变量进行 for 循环?
- c# - 如何在 ASP.NET MVC 上将 Content-Type 设置为完全“文本/纯文本”?
- azure - 在 Azure APIM 新开发者门户中启用 Azure AD 登录
- python - 从列表中删除具有重复键元素的元组
- sql - 创建时间超过 +90 天的记录
- kubernetes - RabbitMQ 配置文件不适用于 Kubernetes 部署
- angular - 无法通过 Angular 使用 Create Order API 端点
- php - 如何使用 php 从 dhtmlx 调度程序保存/更新事件
- magento - Magento 2 在扩展模板中使用自定义块