0

有时变量 doc 或 type 为空。所以我尝试先添加if (type == null){....} else {....}

但如果它是 null 我应该返回什么?现在我尝试使用 try 和 catch 但由于它为空,所以我在另一个使用此类的类中得到空异常。

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 ?

4

2 回答 2

2

如果typenull,显然响应中没有Content-Type标头。

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

然后doc也将是null因为该行将type.StartsWith抛出一个NullReferenceException被您的一般捕获子句吞下的a(a very Bad Thing™)。

If typeis not nullbut docis null,显然内容类型不以 开头text/html

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

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

然后,您处理每次调用时获取null值的可能性。getHtmlDocumentWebClient当没有 HTML 文档时,这取决于您的情况。

请注意Content-Type,如果存在,可能会撒谎。例如,它application/octet-stream几乎可以返回任何东西。

于 2013-03-28T22:42:40.667 回答
0

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

于 2013-03-28T22:39:52.007 回答