如何将foreach循环失败详细信息传递给Catch块

时间:2015-01-20 21:56:19

标签: c# asp.net asp.net-mvc

我有一些C#代码,其中foreach循环用于从外部网站检索数据,并将其匹配并插入数据库。这很容易打破,所以我用try / catch块包围它。我想传递循环失败的集合成员的详细信息(在本例中为Player.Name属性)。

然而,当我捕获异常时,我得到的是一个Null Reference Exception消息,没有任何错误来源的详细信息。有没有办法将此信息传递给catch块,以便我可以将其发送到我的视图?

      try
        {
            document = getHtmlWeb.Load("http://example.com/");

            foreach (Player player in players)
            {
                string pointsString="ExampleString"+player.Name;

                    pointsString = document.DocumentNode
                    .SelectSingleNode(pointsString)
                    .InnerText;

            // other code inserting data to database
            }


            return View();

        }
        catch (Exception)
        {
            return View("Error");
        }

2 个答案:

答案 0 :(得分:1)

首先,我无法在您的代码中看到玩家设置的位置,因此可以解释空引用。其次,我建议创建自己的异常类。如果你这样做,你可以添加你喜欢的任何属性。

Custom Exceptions

答案 1 :(得分:1)

您有两个选择 - 最佳选择:在foreach循环中移动try / catch,以便您可以访问您的播放器:

foreach (Player player in players)
{
    try
    {
        string pointsString="ExampleString"+player.Name;
        pointsString = document.DocumentNode
        .SelectSingleNode(pointsString)
        .InnerText;
    }
    catch (Exception ex)
    {
        // Use player here, break out of the 
        // foreach loop if necessary.
        return View("Error at player " + player.Name);
    }
}

或者,您可以将最后一位玩家存储在try / catch之外:

Player lastPlayerParsed;

try
{
    document = getHtmlWeb.Load("http://example.com/");

    foreach (Player player in players)
    {
        lastPlayerParsed = player;
        string pointsString="ExampleString"+player.Name;

            pointsString = document.DocumentNode
            .SelectSingleNode(pointsString)
            .InnerText;
    }

    return View();
}
catch (Exception)
{
    if (lastPlayerParsed != null) // It could bomb before the foreach!
    {
        return View("Error at player " + lastPlayerParsed.Name);
    }
}

修改:在旁注上,如果您复制的代码准确无误,则NullReferenceException可能实际上是由您的foreach循环中的首席化引起的:

foreach (Player player in players)
{
    string pointsString= "ExampleString" + Player.Name;

这可能意味着Player在这里是小写的,因为Player.Name将引用Player类的静态属性。