我应该在null文档上返回什么?

时间:2013-03-28 22:35:40

标签: c# html-agility-pack

有时变量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;
}

函数get url每次都在某个特定的url上变量类型为null。网站需要密码的原因。

我该如何处理null?

2 个答案:

答案 0 :(得分:2)

如果typenull,则回复中显然没有Content-Type标头。

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

然后doc也将是null,因为第type.StartsWith行会抛出一个NullReferenceException,它被您的一般捕获条款(非常糟糕的东西™)吞噬。

如果type不是nulldocnull,则内容类型显然不是以text/html开头:

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

由于您的函数名为getHtmlDocumentWebClient,我假设它用于获取HTML文档。如果没有此类文档(因为您无法确定内容类型,或者内容类型不是text/html),那么,您的方法应返回{{1 (抛出异常)。您只会在意外时抛出异常,但是对于Web开发,当您获得HTML文档以外的其他内容时,这并不是意料之外的。

然后,您可以在调用null时处理获得null值的可能性。这取决于您在没有HTML文档时所执行的操作。

请注意,getHtmlDocumentWebClient(如果存在)可能存在。例如,几乎任何东西都可以返回Content-Type

答案 1 :(得分:0)

如果结果为null,则调用者应该处理它。如果你可以合理地期望一个null返回参数,那么它可以由调用者进行空测试,或者如果null结果是错误条件,你可以考虑抛出一个异常。在任何情况下,调用者都应该捕获任何潜在的异常并妥善处理。