2013-12-10 28 views
0

我有这个简单的函数,它试图获取页面的Html做一些事情,如果有异常抛出试图多次

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三次返回null这意味着它zhcon失败,所以我想出了以下

一个办法做到这一点是

 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

你究竟想要什么? –

+0

@Rony我想要你的方式 – FPGA

+0

不,但你为什么要搜索HTML?以及为什么你变得空? –

回答

3

可能与休息循环做的时候才发现的HTML:

 string HTML = null; 
     for (int i = 0; i < 3; i++) 
     { 
      HTML = TryGetPageHtml(link, getrandomproxy()); 
      if (HTML != null) 
       break; 
     } 
0

这个怎么样?可能更可读。

var iCount = 0; 
string HTML = null; 

while (iCount++ < 3 && HTML == null) 
{ 
    HTML = TryGetPageHtml(link, getrandomproxy()); 
} 
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); 
     } 
    } 
}