2

我有以下功能将通过代理获取某个网站的 html 源代码,它工作正常,除非服务器返回 503(服务器不可用)或任何其他异常,它永远不会进入 catch 语句。

在 catch 语句中,该函数应该递归调用自身,最多 4 次,如果请求在 4 次尝试后仍然失败,则返回 null。

private static string GetPageHTML(string link,bool useprx)
            {
                int tryCount = 0;
                WebClient client = new WebClient() { Proxy = new WebProxy(ProxyManager.GetProxy()) { Credentials = new NetworkCredential("xx", "xx") } };

                try
                {
                return client.DownloadString(link);
                }
                catch (WebException ex)
                {
                    var statuscode = ((HttpWebResponse)ex.Response).StatusCode;
                    {

                        if (tryCount == 3)
                        {
                            return null;
                        }

                        switch (statuscode)
                        {
                            case (HttpStatusCode.Forbidden):
                                tryCount++;
                                System.Threading.Thread.Sleep(5000); 
                                return GetPageHTML(link, useprx); 

                            case (HttpStatusCode.NotFound): 
                                return null; 


                            case (HttpStatusCode.GatewayTimeout):
                                tryCount++;
                                System.Threading.Thread.Sleep(5000); 
                                return GetPageHTML(link, useprx); 


                            case (HttpStatusCode.ServiceUnavailable) :
                                 tryCount++;
                                System.Threading.Thread.Sleep(5000); 
                                return GetPageHTML(link, useprx);

                            default: return null;

                        }
                    }
                }
            }

那么为什么它从不进入 catch 语句呢?

4

1 回答 1

3

它可能返回一个不是 WebException 类型的异常。要在阳光下捕获所有异常,您必须包含“catch Exception”作为后备

在 WebException 捕获之后添加回退捕获,并对其进行调试以查看它真正返回的异常类型

于 2013-03-28T05:38:04.347 回答