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

How to pass foreach loop failure detail to Catch block

我有一些 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");
        }

首先,我在您的代码中看不到玩家设置的位置,所以这可能解释了空引用。其次,我建议创建您自己的例外 class。如果你这样做,你可以添加任何你喜欢的属性。

Custom Exceptions

您有两个选择 - 最佳选择:将 try/catch 移动到 foreach 循环内,这样您就可以访问您的播放器:

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 class 上的静态 属性。