Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取捕获NullReference异常时哪个字段为null?_C#_.net_Exception Handling - Fatal编程技术网

C# 获取捕获NullReference异常时哪个字段为null?

C# 获取捕获NullReference异常时哪个字段为null?,c#,.net,exception-handling,C#,.net,Exception Handling,是否有可能在捕获NullReference异常时看到哪个字段为null 我知道您可以读取堆栈跟踪行号,但在该行可能有多个字段会导致NullReference异常 恐怕这是不可能的,但如果是这样,为什么这在技术上是不可能的呢?是的,这是可能的。您可以在try-catch之外定义变量的范围,然后将它们添加到异常中。但是,在使用可为null的变量之前,应该检查它们是否为null。如果您不能100%确定它不能为空,最好总是这样 此代码在Console.WriteLine()处崩溃,但现在我确切地知道是哪

是否有可能在捕获NullReference异常时看到哪个字段为null

我知道您可以读取堆栈跟踪行号,但在该行可能有多个字段会导致NullReference异常


恐怕这是不可能的,但如果是这样,为什么这在技术上是不可能的呢?

是的,这是可能的。您可以在try-catch之外定义变量的范围,然后将它们添加到异常中。但是,在使用可为null的变量之前,应该检查它们是否为null。如果您不能100%确定它不能为空,最好总是这样

此代码在
Console.WriteLine()处崩溃,但现在我确切地知道是哪个参数导致了它:

int? a = (int?)null;
int? b = (int?)null;

try
{
    Console.WriteLine(a.Value + b.Value);
}
catch (Exception ex)
{
    ex.Data.Add("a", a);
    ex.Data.Add("b", a);

    throw;
}
您正在从System.Diagnostics.ns中查找。我想它是从.NETFW4.0中出现的。 它评估代码中的前置条件和后置条件,避免了黑暗的NullReferenceException带来的麻烦。你可以这样做:


合同要求(x!=null)

好吧,很遗憾,我没有看到这些问题:

(谢谢@anaximander)

(谢谢@Rohit Vats)


这些答案很好地解释了这一点。

Eric Lippert在不知道ex.Data.Add()的情况下断然回答了这个问题,这可能很有用。但在您的示例中,它需要手动操作(您需要读取所有可能的变量),并且这些变量必须在try-catch之外。同样,这对第三方代码也不起作用。你所说的“手动操作”并不是一件坏事。尤其是当您使用第三方代码时。我强烈建议,如果您不是自己生成输入,请始终验证您的输入。始终使用检查和异常检查一切是否如您预期的那样。因此,如果您在方法的开头检查了输入,那么您就知道变量在try-catch范围之外是100%安全的。这样,您的try-catch没有太多的代码,从而使调试变得更容易。异常还将包含整个失败的场景。我对
感到有点困惑,这也不适用于第三方代码。
。因为您可以很容易地实例化您将要使用的第三方类,并在进入try-catch之前将它们设置为null。但您是对的,您不能将此代码放入第三方库中。你只能希望他们也能以这种方式发展他们的尝试捕捉。然后,他们的异常数据将在.data中包含大量信息,您可以读取这些信息并将其保存到自己的.data.Things中。今天,请查看System.Diagnostics.Contracts命名空间第三方代码如何?这仍然意味着您必须修改代码。但是对于测试来说很有趣。