Console.Write会失败吗

本文关键字:失败 Write Console | 更新日期: 2023-09-27 18:21:19

我正在测试run()函数,以确保它在方法末尾填充了所有正确的内容。我从数据库中填充了4个字段,两个字符串和两个IEnumerable(字符串)。我的想法是把它们全部打印出来,发给我从数据库中提取的所有人。

当我只打印字符串字段时,一切都很好。然而,当我尝试添加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人)中只有两人出现,其余的都是数字。我不应该至少得到字符串"电子邮件"answers",信件"吗?控制台似乎只是决定什么都不做。我知道代码必须到达它,因为它在我调用Console.WriteLine().之前打印出整数I

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

Console.Write会失败吗

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

它们可以包含null条目,甚至完全为空,但它们本身不能是null,或者当您对它们调用.ToArray()时,它会抛出ArgumentNullException。这与您看到的"value cannot be null"异常消息相对应。

它之所以没有崩溃和燃烧,是因为您正在用代码示例中没有发布的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失败了,而是你一开始就没有叫它。

如果值为null,则只将行终止符写入标准输出流。有关行终止符的更多信息,请参阅WriteLine()方法的Remarks部分。-源

除此之外,如果您试图写入控制台的值之一抛出Exception,如以下代码所示:

    private static string SomeVal { get { throw new Exception(); } }
    Console.WriteLine("Foo");
    Console.WriteLine("This throws an exception: " + SomeVal);

这引发了一个异常:"也不会写入控制台;整个字符串仅被认为是CCD_ 16。在我看来,这就是代码中实际发生的事情;您试图写入控制台的值之一是抛出一个Exception,它在某个地方被静默处理。您是否在一个压缩的try/catch子句中运行此代码?

通过在Console.WriteLine或后面的}上设置断点,并检查firstStringsecondString的值,查看它们是否为null,您可以很容易地确定情况是否如此。您还可以判断您试图编写的值之一是否引发了异常。

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