Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Практическое использование исключений с#

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

Комментариев нет:

Отправить комментарий