try не ловит WebException

У меня есть следующая функция, которая доставит мне 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?


person user1590636    schedule 28.03.2013    source источник
comment
Перевод потока в спящий режим на 5 секунд приводит к пустой трате потока. Если вы хотите подождать, установите таймер или что-то в этом роде.   -  person Anthony Pegram    schedule 28.03.2013
comment
Кроме того, ваш tryCount является местным. Когда вы рекурсивно вызываете метод, он получает другой локальный адрес. Если ваш рекурсивный вызов метода завершится ошибкой, он вызовет сам себя, снова с новым локальным адресом. Я думаю, вы обнаружите, что наблюдать за значением tryCount, равным 3, должно быть трудно. Возможно, вы захотите провести рефакторинг и либо передать количество в качестве параметра, чтобы отслеживать его, либо, что предпочтительнее, провести рефакторинг потенциального сбойный код дальше, чтобы вы могли изолировать его и отслеживать его за пределами этой точки сбоя.   -  person Anthony Pegram    schedule 28.03.2013
comment
@AnthonyPegram верно, это тоже нужно исправить   -  person user1590636    schedule 28.03.2013


Ответы (1)


Вероятно, он возвращает исключение, которое не относится к типу WebException. Чтобы поймать все исключения под солнцем, вы должны включить «поймать исключение» в качестве запасного варианта.

Добавьте откат после перехвата WebException и отладьте его, чтобы увидеть, какой тип исключения он действительно возвращает.

person TGH    schedule 28.03.2013
comment
+1, но обратите внимание, что перехват всех исключений обычно является плохой практикой в производственном коде. Вы должны перехватывать только те исключения, которые вы можете осмысленно обработать. - person p.s.w.g; 28.03.2013
comment
@ p.s.w.g да, мне нужно справиться со всем вышеперечисленным. - person user1590636; 28.03.2013
comment
@ p.s.w.g, какая альтернатива? - person JGood; 16.11.2013
comment
@goodwince Как я уже сказал, ловите только те исключения, с которыми вы можете осмысленно справиться, и пусть все остальное всплывает. Обычно вы определяете глобальный обработчик исключений верхнего уровня для обработки любых неперехваченных исключений с целью ведения журнала/отчета об ошибках. Также см. программисты.stackexchange.com/questions/164256/ - person p.s.w.g; 16.11.2013
comment
Отличная ссылка. Связанное обсуждение описывает это как ситуативное, но постарайтесь его раздуть. Спасибо за уточнение, я хотел убедиться, что это все еще обрабатывается глобально. - person JGood; 17.11.2013