2015-01-20 48 views
0

我有一些C#代码,其中使用foreach循环从外部网站检索数据,并将其与数据库匹配并插入到数据库中。这是可以破解的,所以我用try/catch块来包围它。我想传递循环失败的集合中的哪个成员的详细信息(在本例中为Player.Name属性)。如何将foreach循环失败的详细信息传递给Catch块

但是,当我发现异常时,我得到的是一个空引用异常消息,没有任何错误发生地点的详细信息。有没有办法将这个信息传递给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"); 
     } 

回答

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可能实际上你capitialization在你的foreach循环造成的,如果你复制你的代码是正确的:

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

你可能意味着Player这里要小写,因为Player.Name将把静态属性上Player类。

+0

谢谢你,这只是一个错字,当我在这里编辑代码时 – Sperick 2015-01-20 22:21:48

1

首先,我不能在你的代码中看到播放器的设置,以便可以解释空引用。其次,我会建议创建你自己的异常类。如果你这样做,你可以添加你喜欢的任何属性。

Custom Exceptions

相关问题