2012-09-19 65 views
0

這是函數:如果HtmlAgilityPack.HtmlDocument文檔爲空,我該怎麼辦?

private List<string> getLinks(HtmlAgilityPack.HtmlDocument document) 
     { 

       List<string> mainLinks = new List<string>(); 
       var linkNodes = document.DocumentNode.SelectNodes("//a[@href]"); 
       if (linkNodes != null) 
       { 
        foreach (HtmlNode link in linkNodes) 
        { 
         var href = link.Attributes["href"].Value; 
         if (href.StartsWith("http://") == true || href.StartsWith("https://") == true || href.StartsWith("www") == true) // filter for http 
         { 
          mainLinks.Add(href); 
         } 
        } 
       } 

       return mainLinks; 

     } 

有時可變文檔的情況下,nuul網站有超時不responde或鏈接不正確的格式讓說的鏈接的例子:wdfsfdgfsdg

所以在功能測試Im做:

private List<string> test(string url, int levels,DoWorkEventArgs eve) 
     { 

      levels = levelsTo; 
      HtmlWeb hw = new HtmlWeb(); 
      List<string> webSites; 
      try 
      { 
       this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, "Loading The Url: " + url + "..." , Color.Red); })); 
       HtmlAgilityPack.HtmlDocument doc = to.GetHtmlDoc(url, reqOptions, null); 
       if (timeOut == true) 
       { 
        this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, " There Was A TimeOut" + Environment.NewLine , Color.Red); })); 
        timeOut = false; 

       } 
       else 
       { 
        this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, " Done " + Environment.NewLine, Color.Red); })); 
       } 
       webSites = getLinks(doc); 

因此,可以說該URL被wdfsfdgfsdg然後網站呼籲/使用getLinks但因爲URL是錯誤的變量文檔是空,因此無論是在這裏的測試功能或Ť他getLinks函數我需要處理這種情況。我想要做的是,它會告訴用戶有一個超時,但也要繼續下一個網址的過程。在測試函數中,我一次又一次地調用測試函數,如抓取和每次變量url包含不同的url。

這是該行即時通訊做爬行:

csFiles.AddRange(test(t, levels - 1, eve)); 

csFiles是本地列表

所以每次網址包含另一個鏈接,然後試圖讓這個網站的鏈接。 但由於文檔是null,且其去功能getLinks所以在上線getLinks:

var linkNodes = document.DocumentNode.SelectNodes("//a[@href]"); 

即時得到零異常,程序停止。 null是因爲文檔是空的。

那麼我該如何處理這種情況,並使程序繼續到下一個鏈接?不要停止,因爲它是空的,並且有一個例外。

如果我將更新問題並添加完整的測試功能。

回答

1

那麼,它應該像檢查null一樣簡單。

var linkNodes; 

if(document != null) 
{ 
    linkNodes= document.DocumentNode.SelectNodes("//a[@href]"); 
    // other things if document is not null 
} 
else 
{ 
    // handle null case 
} 

如果你依賴從文檔信息,那麼你可以嘗試從別的地方獲得的信息,或中止操作。有沒有什麼你可以做更多

您也可以使用我將取決於try/catch語句try/catch

try 
{ 
    //some code here 
} 
catch(Exception ex) 
{ 
    //log exception, display error to user, or handle exception some way 
} 
finally 
{ 
    optional block. clean up resources 
} 

,如果你可以通過爲空?只需勾選避免異常乾脆。

try/catch更適用於您必須處理的意外異常,或者您無法控制的異常。

+0

薩姆我忘了提及,webSites可能包含網站鏈接列表內例如:http://www.google.com,dsfsgfsg,http://www.google.co.il所以我的意思是當它到達dsfsgfsg站點時將其作爲空值返回,然後繼續到本示例http://www.google.co.il中列表中的下一個鏈接,並且不會因爲dsfsgfsg爲空而停止所有操作。如果主站點列表中的第一個站點爲空,那麼我將不得不停止操作以中止。 –

+0

但是,如果webSites包含一些鏈接,並在中間的某個地方有一個超時站點或空站點或損壞的站點,只需移動到列表中的下一個URL。 –

+0

如果文檔不爲空,那麼做好這個工作。但是,如果它爲null我應該怎麼做才能返回並繼續到List webSites中的下一個鏈接?你寫處理空情況,但我如何處理它,所以它會繼續,而不是拋出異常。 –

相關問題