5

我正在测试我的 run() 函数,以确保它在方法结束时填充了所有正确的内容。我从我们的数据库中填充了 4 个字段、两个字符串和两个 IEnumerable(string)。这个想法是为我从数据库中提取的所有人打印它们。

当我只打印字符串字段时,一切正常。但是,当我也尝试添加 Enumerables 时,根本没有打印任何内容。我也在打印一个计数器,所以我知道程序仍在运行和工作。由于空间或其他原因,控制台是否决定不打印任何内容?

这是执行此操作的代码:

int i = 0;
foreach (Contact contact in Contact.LoadWithPredicate(getAll))
        {
                -------other code to populate fields---------

                i ++;
                Console.WriteLine(i);
                //Turn the Enumerables into strings for printing
                string firstEnumAsString = String.Join(", ", firstEnumerable.ToArray());
                string secondEnumAsString = String.Join(", ", secondEnumerable.ToArray());

                Console.WriteLine("Email: " + firstString+ ", correspondance: " + secondString+ ", PAM addresses: " + firstEnumAsString+ ", famousPeople: " + secondEnumAsString);
}

所以,作为我的输出,每当我运行上面的代码时,我都会得到这样的输出:

1

2

Email: foo@bar.com, correspondance: John, PAM addresses: bar@foo.com, famousPeople: foo, bar, foo

3

4

etc

问题是,总共只有两个人(~425)出现,其余的行只是数字。我不应该至少得到字符串“电子邮件”和“通信”吗?似乎控制台只是决定不做任何事情。而且我知道代码必须到达它,因为它会在我调用 Console.WriteLine() 之前打印出整数 i。

另一方面,每当我要求打印两个字符串字段时,控制台都会在对应的整数之后显示所有 425 个用户的两个字段。有谁知道这里发生了什么?TIA

4

2 回答 2

4

根据您的评论,我认为您的firstEnumerablesecondEnumerable对象都是null. 但是由于您没有发布如何获得这些对象,因此我无法评论它们的原因null或如何修复它。

它们可以包含null 条目,甚至完全为空,但它们本身不能,否则当你调用它们时null它会抛出一个。这与您看到的“值不能为空”异常消息相对应。ArgumentNullException.ToArray()

它没有崩溃和燃烧的原因是因为您正在吞咽(并记录?)迭代循环中的异常,其中包含try/catch未在代码示例中发布的块。


我猜你的实际代码是这样的:

foreach (Contact contact in Contact.LoadWithPredicate(getAll))
{
    try
    {
        ...

        object[] firstEnumerable = null;
        object[] secondEnumerable = null;

        //some logic gates here which under some circumstances do not 
        //assign a valid instance to firstEnumerable or secondEnumerable

        ...
        Console.WriteLine(i); //this prints every time

        //Turn the Enumerables into strings for printing
        string firstEnumAsString = String.Join(", ", firstEnumerable.ToArray()); //exception here
        string secondEnumAsString = String.Join(", ", secondEnumerable.ToArray()); //or exception here

        Console.WriteLine("Email: " + firstString+ ", correspondance: " + secondString+ ", PAM addresses: " + firstEnumAsString+ ", famousPeople: " + secondEnumAsString);
        ...
    }
    catch
    {
        //maybe some logging? maybe not?
    }
}

i这将每次打印出该值。但是,当它尝试创建firstEnumAsStringsecondEnumAsString抛出异常并且永远不会击中您的第二个Console.WriteLine("Email: " + ...);从而产生您所看到的输出时。并不是Console.WriteLine说它失败了,而是你从一开始就没有调用它。

于 2013-07-05T21:53:07.950 回答
2

如果 value 为 null,则仅将行终止符写入标准输出流。有关行终止符的详细信息,请参阅 WriteLine() 方法的备注部分。-来源

最重要的是,如果您尝试写入控制台的值之一抛出Exception,如以下代码所示:

    private static string SomeVal { get { throw new Exception(); } }

    Console.WriteLine("Foo");
    Console.WriteLine("This throws an exception: " + SomeVal);

“这会引发异常:”也不会写入控制台;只考虑整个字符串null。在我看来,这就是您的代码中实际发生的情况;您尝试写入控制台的值之一是抛出异常,它在某处静默处理。您是否在抑制try/catch子句中运行此代码?

Console.WriteLine您可以通过在或尾部放置断点并检查 的值并查看它们是否为空来轻松确定是否是这种}情况。您还可以判断您尝试写入的值之一是否引发了异常。firstStringsecondString

此外,您应该考虑使用string.Format(string format, params object[] args)而不是与 连接+。也使调试代码变得更加容易。

于 2013-07-05T21:39:41.287 回答