我有这个简单的函数试图获取页面Html,如果抛出异常则返回null
public static string TryGetPageHtml(string link, System.Net.WebProxy proxy = null)
{
System.Net.WebClient client = new System.Net.WebClient() { Encoding = Encoding.UTF8 };
if (proxy != null)
{
client.Proxy = proxy;
}
using (client)
{
try
{
return client.DownloadString(link);
}
catch (Exception ex)
{
return null;
}
}
}
我想调用此函数3次,如果它返回null三次,这意味着它faild,所以我想出了以下
这样做的一种方法是
string HTML = null;
int triesRemaining = 3;
while (HTML == null && triesRemaining--!=0)
{
HTML = TryGetPageHtml(link,getrandomproxy());
}
if(HTML == null){//do the handlig}
和我提出的另一个是
HTML = TryGetPageHtml(link,getrandomproxy())??TryGetPageHtml(link,getrandomproxy())??TryGetPageHtml(link,getrandomproxy());
if(HTML == null){//do the handlig}
是否有更好的方法,并且.net中内置了可以使其更具可读性的内容?
答案 0 :(得分:3)
当找到html:
时,可以通过中断执行for循环 string HTML = null;
for (int i = 0; i < 3; i++)
{
HTML = TryGetPageHtml(link, getrandomproxy());
if (HTML != null)
break;
}
答案 1 :(得分:1)
或者您可以将其设置为递归函数,将尝试次数作为参数。
public static string TryGetPageHtml(string link, int attempCount = 1,
System.Net.WebProxy proxy = null, string foundHTML = null)
{
if(attemptCount == 0 || foundHTML != null)
{
return foundHTML;
}
if (proxy != null)
{
client.Proxy = proxy;
}
using (System.Net.WebClient client = new System.Net.WebClient())
{
client.Encoding = Encoding.UTF8;
try
{
foundHTML = client.DownloadString(link);
}
catch (Exception ex)
{
return null; //Remove this if we want to retry on exception
}
finally
{
return TryGetPageHtml(link, --attemptCount, proxy, foundHTML);
}
}
}
答案 2 :(得分:0)
这个怎么样?可能更具可读性。
var iCount = 0;
string HTML = null;
while (iCount++ < 3 && HTML == null)
{
HTML = TryGetPageHtml(link, getrandomproxy());
}