0

这是功能:

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 为空,所以在测试函数或 getLinks 函数中我需要处理这种情况。我想要做的是它会告诉用户有一个超时,但也会继续处理到下一个 url。在测试函数中,我一次又一次地调用测试函数,就像爬行一样,每次变量 url 都包含不同的 url。

这是我做爬行的那一行:

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

csFiles 是一个本地列表

所以每次 url 都包含另一个链接,然后尝试获取该网站的链接。但是由于 doc 是 null 并且它转到函数 getLinks 所以在 getLinks 上就行了:

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

我得到空异常并且程序停止。null 是因为文档为空。

那么我该如何处理这种情况并使程序继续到下一个链接?并且不要停止,因为它的 null 并且有一个例外。

如果是,我将更新问题并添加完整的测试功能。

4

1 回答 1

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 更适合您必须处理的意外异常或您无法控制的异常。

于 2012-09-19T21:39:52.543 回答