这是功能:
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,例如,链接为:wdfsfdgfsdg
所以在函数测试中我正在做:
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,然后webSites正在调用/使用getLinks,但由于url错误,变量doc为null,因此无论是在测试函数还是在getLinks函数中,我都需要处理这种情况。我想要做的是它会告诉用户有超时但是还要继续进入下一个网址。在测试函数中,我一次又一次地调用测试函数,就像爬行一样,每次变量url都包含不同的url。
这是我正在进行抓取的行:
csFiles.AddRange(test(t, levels - 1, eve));
csFiles是本地列表
因此,每次url包含另一个链接,然后尝试获取此网站的链接。 但是因为doc是null并且它在getLinks中使用getLinks函数所以:
var linkNodes = document.DocumentNode.SelectNodes("//a[@href]");
我得到null异常并且程序停止。 null是因为document是null。
那么如何处理这种情况并使程序继续下一个链接?并且不要因为它的null而停止并且有例外。
如果我将更新问题并添加完整的测试功能。
答案 0 :(得分: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
{
//some code here
}
catch(Exception ex)
{
//log exception, display error to user, or handle exception some way
}
finally
{
optional block. clean up resources
}
如果您可以通过简单地检查null来完全避免异常,我会依赖于try / catch。
try / catch更适合您必须处理的意外异常,或者您无法控制的异常。