2013-09-30 25 views
0

我有以下代码:如何在不跳过合法循环的情况下处理nullreferenceexception?

foreach (SPListItem item in list.Items) 
{ 

    string itemId = item.ID.ToString(); 
    string contentType = item.ContentType.ToString(); 
    string displayName = item.DisplayName; 
    string name = item.Name; 

    // todo: Title not always retreiving? Likely due to folders, needs more handling 
    //string title = item["Title"].ToString() ?? null; 
    string title = ""; 

    string url = item.Url; 
    string author = item["Created By"].ToString(); 

    // todo: Checked out files catering 
    const string checkedOutBy = ""; 

    DateTime lastModified = Convert.ToDateTime(item["Modified"]); 
    string lastModifiedBy = item["Modified By"].ToString(); 
    DateTime created = Convert.ToDateTime(item["Created"]); 


    query.RecordItems(itemId, contentType, 
         displayName, name, 
         title, url, author, 
         checkedOutBy, 
         lastModified, 
         lastModifiedBy, 
         created, 
         author); 
} 

我的问题是环路标题或ContentType的一些迭代将抛出一个NullReferenceException,但不是所有的人。我相信我已经满足了以下要求,但我不确定 - 有没有更好的方法?

foreach (SPListItem item in list.Items) 
{ 
    try 
    { 
     string itemId = item.ID.ToString(); 
     string contentType = item.ContentType.ToString(); 
     string displayName = item.DisplayName; 
     string name = item.Name; 

     // todo: Title not always retreiving? Likely due to folders, needs more handling 
     //string title = item["Title"].ToString() ?? null; 
     string title = ""; 

     string url = item.Url; 
     string author = item["Created By"].ToString(); 

     // todo: Checked out files catering 
     const string checkedOutBy = ""; 

     DateTime lastModified = Convert.ToDateTime(item["Modified"]); 
     string lastModifiedBy = item["Modified By"].ToString(); 
     DateTime created = Convert.ToDateTime(item["Created"]); 


     query.RecordItems(itemId, contentType, 
          displayName, name, 
          title, url, author, 
          checkedOutBy, 
          lastModified, 
          lastModifiedBy, 
          created, 
          author); 
    } 
    catch (NullReferenceException ex) 
    { 
     Logger.Error("[{0}] Filed moving on file {1} as not all content was present", item.Name); 
    } 

} 
+0

的http:// msdn.microsoft.com/en-us/library/bb687949(v=office.12).aspx请收集一些SharePoint最佳实践。例如'不要枚举整个SPList.Items集合' –

回答

1

可以过滤项目和循环它们如下

list = list.Items.Where(i=> i.ContentType !=null && i["Title"] !=null).ToList(); 

,如果你不需要做所有上述验证和过滤器,你最好移动到for loop

for (int i = 0; i < list.Items.Count; i++) 
{ 
    try 
    { 
     SPListItem item = list.Items[i]; 
     // your code 
    } 
    catch (NullReferenceException ex) 
    { 
     Logger.Error("[{0}] Filed moving on file {1} as not all content was present", item.Name); 
    } 

} 
+0

'SPListItem item = list.Items [i];'no。你不会在SharePoint中这样做,因为它不会缓存'list.Items',但每次都会从服务器获取列表 –

+0

@DmitryDovgopoly OP没有提供关于'list'的详细信息。它可能已经被缓存了,你认为这是这个异常的根本过程吗? – Damith

+0

显然它不是异常的来源,但它是非常不推荐的使用'SPList.Items'的方式。 'list'是'SPList',因为在这种情况下它可以不是别的。 –

2

希望我真的在这里uderstand的问题,所以为什么不..

foreach (SPListItem item in list.Items) 
{ 
    ...... 
    if(title == null || item.ContentType == null) 
     continue; 


    .... 
} 

如果这不是你问什么,请澄清。

+2

有问题的代码将抛出'item.ContentType.ToString();'所以你应该检查'item.ContentType'而不是'contentetype' –

+0

@DmitryDovgopoly:钉它, 谢谢 ! – Tigran

相关问题