C# 如何将foreach循环故障详细信息传递给Catch块
我有一些C#代码,其中使用foreach循环从外部网站检索数据,并将其匹配并插入数据库。这是一个不易破坏的,所以我用try/catch块将其包围。我想传递循环失败的集合成员的详细信息(在本例中是Player.Name属性) 然而,当我捕捉到异常时,我得到的只是一条空引用异常消息,没有任何错误起源的详细信息。是否有方法将此信息传递到catch块,以便我可以将其发送到我的视图C# 如何将foreach循环故障详细信息传递给Catch块,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有一些C#代码,其中使用foreach循环从外部网站检索数据,并将其匹配并插入数据库。这是一个不易破坏的,所以我用try/catch块将其包围。我想传递循环失败的集合成员的详细信息(在本例中是Player.Name属性) 然而,当我捕捉到异常时,我得到的只是一条空引用异常消息,没有任何错误起源的详细信息。是否有方法将此信息传递到catch块,以便我可以将其发送到我的视图 try { document = getHtmlWeb.Load("ht
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");
}
首先,我看不到您的代码中设置了播放器,所以这可能解释了空引用。其次,我建议您创建自己的异常类。如果您这样做,您可以添加任何您喜欢的属性
首先,我看不到您的代码中设置了播放器,因此这可能解释了空引用。其次,我建议您创建自己的异常类。如果您这样做,您可以添加任何您喜欢的属性
首先,我看不到您的代码中设置了播放器,因此这可能解释了空引用。其次,我建议您创建自己的异常类。如果您这样做,您可以添加任何您喜欢的属性
首先,我看不到您的代码中设置了播放器,因此这可能解释了空引用。其次,我建议您创建自己的异常类。如果您这样做,您可以添加任何您喜欢的属性
您有两个选择-最佳选择:将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);
}
}
Edit:在旁注中,如果您复制的代码是准确的,则您的NullReferenceException
实际上可能是由foreach循环中的大写字母引起的:
foreach (Player player in players)
{
string pointsString= "ExampleString" + Player.Name;
您可能是想让
Player
在这里小写,因为Player.Name
将引用Player
类上的静态属性。您有两个选项-最佳选项:将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);
}
}
Edit:在旁注中,如果您复制的代码是准确的,则您的NullReferenceException
实际上可能是由foreach循环中的大写字母引起的:
foreach (Player player in players)
{
string pointsString= "ExampleString" + Player.Name;
您可能是想让
Player
在这里小写,因为Player.Name
将引用Player
类上的静态属性。您有两个选项-最佳选项:将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);
}
}
Edit:在旁注中,如果您复制的代码是准确的,则您的NullReferenceException
实际上可能是由foreach循环中的大写字母引起的:
foreach (Player player in players)
{
string pointsString= "ExampleString" + Player.Name;
您可能是想让
Player
在这里小写,因为Player.Name
将引用Player
类上的静态属性。您有两个选项-最佳选项:将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);
}
}
Edit:在旁注中,如果您复制的代码是准确的,则您的NullReferenceException
实际上可能是由foreach循环中的大写字母引起的:
foreach (Player player in players)
{
string pointsString= "ExampleString" + Player.Name;
你的意思可能是让
Player
在这里小写,因为Player.Name
将引用Player
类上的静态属性。谢谢,是的,当我在这里编辑代码时这只是一个输入错误谢谢,是的,当我在这里编辑代码时这只是一个输入错误谢谢,是的,当我在这里编辑代码时这只是一个输入错误谢谢,是的,那只是一个输入错误在这里编辑代码