我有一些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");
}
答案 0 :(得分:1)
首先,我无法在您的代码中看到玩家设置的位置,因此可以解释空引用。其次,我建议创建自己的异常类。如果你这样做,你可以添加你喜欢的任何属性。
答案 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
类的静态属性。