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

标签 c# logging nullreferenceexception

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

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

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

我还找到了this question它问了同样的问题,但那是从 2011 年开始的,我不知道从那时起是否有任何变化。

编辑:The question这被标记为重复确实是重复但也很旧(2008)。从那以后有什么改变吗?

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

最佳答案

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

关于c# - 你能捕获抛出 NullReferenceException 的对象的名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55419825/

相关文章:

c# - 使用 C# 的 HTTP MAC 身份验证

c# - 如何在 C# HTTPListener 中使用 CSS 和 JS 请求完整的 HTML 页面

scala - 如何在 sbt 测试中覆盖 application.conf 中的日志级别?

xcode - 如何修复 xcode 错误 "web filter is active"?

C# 对象引用未设置为对象错误的实例

窗口之间的 C# 数据丢失

c# - 从 .NET 应用程序访问 TCP/IP 路由信息

c# - 从 URL 获取 TIF 并将其移动到 C# 中的 Azure Blob 存储中

java - Log4j 无法读取配置文件 SELENIUM JAVA

unity3d - unity Vuforia NullReferenceException