有时变量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?
答案 0 :(得分:2)
如果type
为null
,则回复中显然没有Content-Type
标头。
string type = clients.ResponseHeaders["content-type"];
然后doc
也将是null
,因为第type.StartsWith
行会抛出一个NullReferenceException
,它被您的一般捕获条款(非常糟糕的东西™)吞噬。
如果type
不是null
但doc
是null
,则内容类型显然不是以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结果是错误条件,你可以考虑抛出一个异常。在任何情况下,调用者都应该捕获任何潜在的异常并妥善处理。