0

変数 doc または type が null の場合があります。だから私は最初に追加しようとしましたif (type == null){....} else {....}

しかし、それが null の場合、何を返す必要がありますか? 今、try と catch を使用しようとしましたが、null であるため、このクラスを使用している別のクラスで null 例外が発生します。

public static HtmlAgilityPack.HtmlDocument getHtmlDocumentWebClient(string url, bool useProxy, string proxyIp, int proxyPort, string usename, string password)
{
    HtmlAgilityPack.HtmlDocument doc = null;
    using (MyClient clients = new MyClient())
    {
        clients.HeadOnly = true;
        byte[] body = clients.DownloadData(url);
        // note should be 0-length
        string type = clients.ResponseHeaders["content-type"];
        clients.HeadOnly = false;
        // check 'tis not binary... we'll use text/, but could
        // check for text/html
        try
        {
            if (type.StartsWith(@"text/html"))
            {
                string text = clients.DownloadString(url);
                doc = new HtmlAgilityPack.HtmlDocument();
                WebClient client = new WebClient();
                //client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
                client.Credentials = CredentialCache.DefaultCredentials;
                client.Proxy = WebRequest.DefaultWebProxy;
                if (useProxy)
                {
                    //Proxy                
                    if (!string.IsNullOrEmpty(proxyIp))
                    {
                        WebProxy p = new WebProxy(proxyIp, proxyPort);
                        if (!string.IsNullOrEmpty(usename))
                        {
                            if (password == null)
                                password = string.Empty;
                            NetworkCredential nc = new NetworkCredential(usename, password);
                            p.Credentials = nc;
                        }
                    }
                }
                doc.Load(client.OpenRead(url));
            }
        }
        catch
        {
        }
    }
    if (doc == null)
    {
        //MessageBox.Show("Doc is null   " + doc + " The link that did it was    " + url);
    }
    return doc;
}

関数は毎回URLを取得し、特定のURLでは変数の型がnullです。サイトがパスワードか何かを必要とする理由。

null をどのように処理すればよいですか?

4

2 に答える 2

2

typeの場合null、明らかにContent-Type応答にヘッダーがありません。

string type = clients.ResponseHeaders["content-type"];

次に、一般的な catch-clause (非常に悪いこと™) によって飲み込まれる a をdocnulltype.StartsWithスローするためです。NullReferenceException

typeではないnulldocである場合null、どうやら content-type は で始まらないtext/html:

 if (type.StartsWith(@"text/html"))
     doc = new HtmlAgilityPack.HtmlDocument();

関数の名前getHtmlDocumentWebClientは であるため、HTML ドキュメントを取得するために使用されると想定しています。そのようなドキュメントがない場合 (コンテンツ タイプを特定できなかったか、コンテンツ タイプが 以外であったためtext/html)、yes、メソッドは返されるnull(または例外をスローする) 必要があります。予期しない場合にのみ例外をスローしますが、Web 開発では、HTML ドキュメント以外のものを取得した場合、実際には予期しないことではありません。

次に、が呼び出されるnullたびに値を取得する可能性を処理します。getHtmlDocumentWebClientHTML ドキュメントがない場合にどうするかは、状況によって異なります。

Content-Typeが存在する場合は、嘘をつく可能性があることに注意してください。たとえば、application/octet-streamほとんど何でも返すことができます。

于 2013-03-28T22:42:40.667 に答える
0

結果が null の場合、呼び出し元がそれを処理する必要があります。null 戻り引数が合理的に期待できる場合は、null テストを実行するか、null 結果がエラー条件である場合に例外をスローするかは呼び出し元次第です。いずれにせよ、呼び出し元は潜在的な例外をキャッチし、適切に処理する必要があります。

于 2013-03-28T22:39:52.007 に答える