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がnullであるため、ここのテスト関数またはgetLinks関数でこのケースを処理する必要があります. 私がやりたいことは、タイムアウトがあったことをユーザーに伝えるだけでなく、次のURLへのプロセスを続行することです。テスト関数では、クロールのようにテスト関数を何度も呼び出し、そのたびに変数 url に異なる URL が含まれています。

これは、クロールを行っている行です。

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

csFiles はローカル リストです

したがって、URL に別のリンクが含まれるたびに、この Web サイトのリンクを取得しようとします。しかし、doc は null であり、関数 getLinks に移動するため、次の行の getLinks で:

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

null例外が発生し、プログラムが停止します。null はドキュメントが 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 に答える