debugging 在没有Visual Studio调试模式的情况下,是否可以自动打印在NullReferenceException中为null的变量?

mwngjboj  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(119)

假设我有一个类,有很多成员和嵌套成员,执行这个调用,其中一个变量为null(除了等式两边的最后一个变量):

Obj.Field.NextField.NextNextField = NextObj.OtherField.NextOtherField.NextNextOtherField;

我将得到一个NullReferenceException,它表示此行中的一个对象为null。在本例中,有6种不同的情况可能会引发异常。
到目前为止,我经常遇到这种情况,并且总是执行以下操作来找出哪个成员实际上是null。

public static void PrintNullOrigin(params object[] _args)
    {
        for (int i = 0; i < _args.Length; i++)
        {
            if (_args[i] == null)
            {
                print(_args[i] + " is null!");
            }
        }
    }

但在这种情况下,你仍然必须这样做:

PrintNullOrigin(Obj, NextObj, Obj?.Field, NextObj?.OtherField, ...);

有没有一种方法可以在任何时候抛出NullReferenceException时,记录器都会自动执行此操作?
我尝试通过Exception对象获取NullReferenceException所源自的行中的成员,但是我找不到任何使这变得容易的东西。

编辑:

我必须在这里强调,我想知道是否有可能在Visual Studio调试模式之外进行此操作。
在Unity中,应尽量少使用Visual Studio的调试模式,因为在运行时可能会发生崩溃和性能损失。

mf98qq94

mf98qq941#

当您存取字段时,无法打印出哪一个字段是空值。在存取字段之前,您仍必须进行一些检查。此检查可以有多种方式:
1.您可以使用类似CheckForNull(NextObj,“NextObj.OtherField.NextOtherField.NextNextOtherField”)的函数,然后通过拆分第二个参数并使用反射-您可以调查此路径中的哪些字段为空
1.这种方式有点复杂:第二个参数的类型可以是Expression〈Func〈NextObj,T〉〉,值可以是obj =〉NextObj. OtherField. NextOtherField. NextNextOtherField.这样你就有了这个Map的表达式,你可以通过检查这个表达式树来找出哪个字段是空的。
但总的来说,如果你有这样的东西:“NextObj.OtherField.NextOtherField.NextNextOtherField”这是一个不好的信号-因为当你不得不这样做时,它是一个架构很差的应用程序。

qij5mzcb

qij5mzcb2#

您可以执行以下操作:

var propertiesTree = "NextObj.OtherField.NextOtherField.NextNextOtherField".Split('.');
object obj = NextObj;
for(var index = 1; index < propertiesTree.Length; index++)
{
    var property = obj.GetType().GetProperty(propertiesTree[index]);
    var value = property.GetValue(obj);
    if (value == null) { throw new Exception($"{propertiesTree[index]} is null"); }
    obj = value;
}

// if we are here - then all fields are not null

相关问题