首页 > 解决方案 > 你能捕捉到抛出 NullReferenceException 的对象的名称吗?

问题描述

有没有办法找出是什么特定对象引起的NullReferenceException?我已经阅读了关于故障排除NullReferenceException页面,它谈到了在调试器中检查变量并查看异常消息。

如果在生产代码中引发了异常,因此您无法运行调试器来检查变量怎么办?异常消息显示堆栈跟踪,因此您可以查看引发异常的方法,但它没有说明是哪个特定对象null

我希望能够将作为错误消息的对象的名称添加null到错误消息中,这样当我查看来自用户的报告并遇到 时NullReferenceException,我可以轻松查看对象是什么null并修复它。有谁知道这样做的方法?

我还发现了这个问题,它问了同样的问题,但它是从 2011 年开始的,我不知道从那时起是否有任何变化。

编辑:这被标记为重复的问题确实是重复的,但也很老(2008)。从那以后有什么改变吗?

编辑2:我在谷歌搜索这个问题时发现了这个。Visual Studio 可以告诉你是什么扔了NullReferenceException; 有没有办法利用它来将它添加到日志文件中?

标签: c#loggingnullreferenceexception

解决方案


考虑到堆栈跟踪,应该相对容易弄清楚,但更好的方法是在代码中包含“验证”或参数和/或空检查,并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));
    ...
}

推荐阅读