你能捕获抛出NullReferenceException的对象的名称吗?

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

有没有办法找出导致NullReferenceException的具体对象?我已经阅读了有关troubleshooting NullReferenceExceptions的页面,它讨论了在调试器中检查变量并查看异常消息。

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

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

我也发现this question问同样的事情,但它是从2011年开始,我不知道从那以后有什么变化。

编辑:The question,这被标记为重复确实是重复,但也很老(2008年)。从那时起有什么变化吗?

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

c# logging nullreferenceexception
1个回答
3
投票

给出堆栈跟踪应该相对容易找出,但更好的方法是在代码中包含“验证”或参数和/或空检查,并在尝试访问变量的成员之前自己显式抛出ArgumentNullException。可能尚未初始化。然后,您可以提供未初始化对象的名称:

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));
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.