-2

コードは次のとおりです。

catch (WebException ex)
            {
                failed = true;
                wccfg.failedUrls++;
                return csFiles;
            }
            catch (Exception ex)
            {
                failed = true;
                wccfg.failedUrls++;
                throw;
            }

例外は例外です。例外メッセージは次のとおりです: NullReferenceException : オブジェクト参照がオブジェクトのインスタンスに設定されていません

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=GatherLinks
  StackTrace:
       at GatherLinks.TimeOut.getHtmlDocumentWebClient(String url, Boolean useProxy, String proxyIp, Int32 proxyPort, String usename, String password) in d:\C-Sharp\GatherLinks\GatherLinks-2\GatherLinks\GatherLinks\TimeOut.cs:line 55
       at GatherLinks.WebCrawler.webCrawler(String mainUrl, Int32 levels) in d:\C-Sharp\GatherLinks\GatherLinks-2\GatherLinks\GatherLinks\WebCrawler.cs:line 151
       at GatherLinks.WebCrawler.webCrawler(String mainUrl, Int32 levels) in d:\C-Sharp\GatherLinks\GatherLinks-2\GatherLinks\GatherLinks\WebCrawler.cs:line 151
       at GatherLinks.WebCrawler.webCrawler(String mainUrl, Int32 levels) in d:\C-Sharp\GatherLinks\GatherLinks-2\GatherLinks\GatherLinks\WebCrawler.cs:line 151
       at GatherLinks.BackgroundWebCrawling.secondryBackGroundWorker_DoWork(Object sender, DoWorkEventArgs e) in d:\C-Sharp\GatherLinks\GatherLinks-2\GatherLinks\GatherLinks\BackgroundWebCrawling.cs:line 82
       at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
       at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
  InnerException: 

これは、WebCrawler 関数内にある try コードです。

public List<string> webCrawler(string mainUrl, int levels)
        {

            busy.WaitOne();


            HtmlWeb hw = new HtmlWeb();
            List<string> webSites;
            List<string> csFiles = new List<string>();

            csFiles.Add("temp string to know that something is happening in level = " + levels.ToString());
            csFiles.Add("current site name in this level is : " + mainUrl);

            try
            {
                HtmlAgilityPack.HtmlDocument doc = TimeOut.getHtmlDocumentWebClient(mainUrl, false, "", 0, "", "");
                done = true;

                Object[] temp_arr = new Object[8];
                temp_arr[0] = csFiles;
                temp_arr[1] = mainUrl;
                temp_arr[2] = levels;
                temp_arr[3] = currentCrawlingSite;
                temp_arr[4] = sitesToCrawl;
                temp_arr[5] = done;
                temp_arr[6] = wccfg.failedUrls;
                temp_arr[7] = failed;

                OnProgressEvent(temp_arr);


                currentCrawlingSite.Add(mainUrl);
                webSites = getLinks(doc);
                removeDupes(webSites);
                removeDuplicates(webSites, currentCrawlingSite);
                removeDuplicates(webSites, sitesToCrawl);
                if (wccfg.removeext == true)
                {
                    for (int i = 0; i < webSites.Count; i++)
                    {
                        webSites.Remove(removeExternals(webSites,mainUrl,wccfg.localy));
                    }
                }
                if (wccfg.downloadcontent == true)
                {
                     retwebcontent.retrieveImages(mainUrl); 
                }

                if (levels > 0)
                    sitesToCrawl.AddRange(webSites);



                if (levels == 0)
                {
                    return csFiles;
                }
                else
                {


                    for (int i = 0; i < webSites.Count(); i++)
                    {


                        if (wccfg.toCancel == true)
                        {
                            return new List<string>();
                        }
                        string t = webSites[i];
                        if ((t.StartsWith("http://") == true) || (t.StartsWith("https://") == true)) 
                        {
                            csFiles.AddRange(webCrawler(t, levels - 1));
                        }

                    }
                    return csFiles;
                }



            }

            catch (WebException ex)
            {
                failed = true;
                wccfg.failedUrls++;
                return csFiles;
            }
            catch (Exception ex)
            {
                failed = true;
                wccfg.failedUrls++;
                throw;
            }
        }

これは、クラスの上部で wccfg を使用する方法です。

private System.Threading.ManualResetEvent busy;
        WebcrawlerConfiguration wccfg;
        List<string> currentCrawlingSite;
        List<string> sitesToCrawl;
        RetrieveWebContent retwebcontent;
        public event EventHandler<WebCrawlerProgressEventHandler> ProgressEvent;
        public bool done;
        public bool failed;

        public WebCrawler(WebcrawlerConfiguration webcralwercfg)
        {
            failed = false;
            done = false;
            currentCrawlingSite = new List<string>();
            sitesToCrawl = new List<string>();
            busy = new System.Threading.ManualResetEvent(true);
            wccfg = webcralwercfg; 
        }
4

2 に答える 2

3

NullReferenceExceptiontry ブロックで使用する前に何かを初期化できなかったため、 を取得しています。

次に、コードはcatch(Exception ex)ブロックに入り、カウンターをインクリメントし、 を設定failed=trueしてから、 を再スローしNullReferenceExceptionます。

于 2013-03-28T17:47:39.033 に答える
1

この関数呼び出しには何か不満があります:

TimeOut.getHtmlDocumentWebClient(mainUrl, false, "", 0, "", "")

throwステートメントでデバッガーが停止した理由は、元の例外をキャッチしてデバッガーから隠したためです。「ファーストチャンス例外でブレーク」のデバッグ オプションを設定します。これにより、例外が実際に発生した場所を確認したり、変数を調べたりすることができます。

キャッチオール例外ハンドラは多くの重要なエラー情報を飲み込んでしまうため、通常、#ifデバッグ中にキャッチオール例外ハンドラを除外することをお勧めします。あなたがしていることについては、とにかくtry/を使用する方がおそらく良いでしょう。finally

于 2013-03-28T17:58:24.840 に答える