#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. Надо обрабатывать только те исключения, которые являются ожидаемыми.
Комментариев нет:
Отправить комментарий