#c_sharp #исключения #xnet
Вот у меня есть этот код, я не совсем понял как в этом случае использовать исключение: public static string PostRequest(string Url, string PostData = "", string UserAgent = "", string Referer = "", CookieDictionary Cookies = null, ProxyType ProxyProto = ProxyType.None, string ProxyString = "") { request.Proxy = Socks5ProxyClient.Parse(ProxyString); ... try { HttpResponse response = request.Post(Url, PostData, "application/x-www-form-urlencoded"); Cookies = response.Cookies; response_html = response.ToString(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } Как мне узнать, какое именно исключение вызвалось, то есть узнать в чем проблема - либо удаленный хост недоступен, либо сокс север не отвечает? Во всех примерах что я видел во время исключения вызывалось какое-нибудь логирование и функция завершалась. Но мне нужно сделать немного по-другому, если сокс не отвечает: попыпаться отправить запрос через некоторое время. Обычно бы я сделал просто так: while(i<3) { data = PostRequest(); if(data != null) break; Thread.Sleep(5000); } Но как мне выкинуть исключение, допустим, с кодом ответа, что мол сокс-сервер не отвечает, и пока не придет ответ, либо пока все три итерации не пройдут, пытаться отправить запрос? Заранее спасибо! UPD: Немного посмотрел на исключения в библиотеке xNet и они как-то странно работают. Там есть три типа исключений xNet.NetException, xNet.ProxyException и еще один тип. Но почему-то всегда выбрасывается дефолтное (остальные не ловятся). Я хотел узнать, можно ли использовать такой подход при определении типа исключений: catch (Exception ex) { //MessageBox.Show(ex.Message); //MessageBox.Show(ex.InnerException.ToString()); if(ex.InnerException.ToString().IndexOf("xNet.ProxyException:") > 0 && ex.InnerException.ToString().IndexOf("Socket") > 0) { //MessageBox.Show("F"); throw new xNet.ProxyException(); } throw new xNet.NetException(); } То есть определить тип исключения по тексту в нем и потом уже выбросить нужное? Кажется что так неправильно делать, но по-другому я не нашел как их различать, потому что всегда Exception выбрасывается.
Ответы
Ответ 1
Исходя из того, что библиотека xNet (стоило кстати упомянуть это название) использует собственные исключения, можно сделать так: public static string PostRequest(string Url, string PostData = "", string UserAgent = "", string Referer = "", CookieDictionary Cookies = null, ProxyType ProxyProto = ProxyType.None, string ProxyString = "") { request.Proxy = Socks5ProxyClient.Parse(ProxyString); ... try { HttpResponse response = request.Post(Url, PostData, "application/x-www-form-urlencoded"); Cookies = response.Cookies; response_html = response.ToString(); } catch (xNet.Net.HttpException ex) { // ошибка случилась внутри библиотеки } catch (Exception ex) { // все остальные ошибки } }Ответ 2
Поставьте брейкпоинт на строчку MessageBox.Show(ex.Message); и попытайтесь найти в отладчике отличия в пойманном исключении. Если библиотека Socks5ProxyClient написано пряморукими программистами - то отличие будет в типе исключения. Иначе придется догадываться по косвенным признакам.Ответ 3
Надо использовать ex.ToString(), а не ex.Message. Надо обрабатывать только те исключения, которые являются ожидаемыми.
Комментариев нет:
Отправить комментарий