如何将 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。如果你这样做,你可以添加任何你喜欢的属性。
您有两个选择 - 最佳选择:将 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 上的静态 属性。
我有一些 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。如果你这样做,你可以添加任何你喜欢的属性。
您有两个选择 - 最佳选择:将 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 上的静态 属性。