【问题标题】:try is not catching WebException尝试没有捕获 WebException
【发布时间】:2023-03-28 00:10:01
【问题描述】:

我有以下功能将通过代理为我获取某个网站的 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 语句?

【问题讨论】:

  • 让线程休眠 5 秒是浪费线程。如果你想等待,设置一个计时器或其他东西。
  • 另外,您的tryCount 是本地人。当您递归调用该方法时,它会获得一个不同的本地。如果您的递归方法调用失败,它将再次调用自己,并使用一个新的本地。我想您会发现观察 tryCount 值为 3 应该是困难的。您可能想要重构并将计数作为参数传递,以便您可以跟踪它,或者最好重构潜在的进一步排除故障代码,以便您可以隔离它并在该故障点之外跟踪它。
  • @AnthonyPegram 没错,这也需要修复

标签: c# httpwebrequest try-catch system.net.webexception


【解决方案1】:

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

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

【讨论】:

  • +1 但请注意,在生产代码中捕获所有异常通常是不好的做法。你应该只捕获你可以有意义地处理的异常。
  • @p.s.w.g 是的,我需要处理以上所有问题。
  • @p.s.w.g,还有什么选择?
  • @goodwince 正如我所说,只捕获您可以有意义地处理的异常,然后让其他所有内容冒泡。通常,您将定义一个顶级全局异常处理程序来处理任何未捕获的异常,以便记录/错误报告。另见programmers.stackexchange.com/questions/164256/…
  • 优秀的链接。链接的讨论将其描述为情境,但旨在将其冒泡。感谢您的澄清,我想确保它仍在全球范围内处理。
猜你喜欢
  • 2021-03-31
  • 2013-02-05
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多