Ошибка перехвата с webexception - PullRequest
5 голосов
/ 03 ноября 2011

Я использую простой веб-клиент для извлечения некоторого XML из веб-службы, он заключен в простой блок try-catch (перехват исключений WebException).Подобно следующему:

try
        {
            WebClient client = new WebClient();
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
            client.DownloadStringAsync(new Uri("http://ip/services"));
        }
        catch (WebException e)
        {

            Debug.WriteLine(e.Message);
        }

Нет, если я изменю IP-адрес на недопустимый, я бы ожидал, что он выдаст исключение и выведет сообщение в окно отладки.Но это не так, кажется, что блок catch даже не выполняется.Ничего не появляется и окна отладки, кроме следующих:

A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll
A first chance exception of type 'System.Net.WebException' occurred in System.Windows.dll
A first chance exception of type 'System.Net.WebException' occurred in System.Windows.dll

Мой код выглядит мне правильно, поэтому я не могу понять, почему исключения не перехватываются?

Ответы [ 2 ]

7 голосов
/ 03 ноября 2011

Из вашего описания сообщений об ошибках я бы предположил, что действительное исключение имеет тип «FileNotFoundException».

Вы пытались просто перехватить исключение и проверить тип?Возможно, что веб-исключение является внутренним исключением.

        try
        {
            WebClient client = new WebClient();
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
            client.DownloadStringAsync(new Uri("http://ip/services"));
        }
        catch (Exception ex)
        {

            Debug.WriteLine(ex.GetType().FullName);
            Debug.WriteLine(ex.GetBaseException().ToString());
        }

ОБНОВЛЕНИЕ: я только что заметил, что то, что вы на самом деле вызываете, является асинхронным методом.

В качестве проверки работоспособности я бы предложилпереключиться на не асинхронный метод и проверить ошибку, вызванную этим.

Метод WebClient.DownloadString (Uri)

Вы также можете воспользоваться этой страницей, в которой в качестве примера рассматривается перехват асинхронных ошибок с использованием веб-клиента.

Асинхронные исключения

3 голосов
/ 03 ноября 2011

Исключение никогда не будет вызываться из DownloadStringAsync. Он просто не сгенерирует его, но DownloadString (не Async) сгенерирует его. Я не знаю, является ли это ошибкой, я думал, что асинхронные методы никогда не выбрасывают исключения кроме ArgumentException, хотя документация заявляет в противном случае.

Вы должны «перехватить» ошибку в DownloadStringCompletedEventHandler:

void DownloadStringCompletedEventHandler(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null)
    {
        Debug.WriteLine(e.Error);
        return;
    }

Вы почти всегда можете безопасно игнорировать исключения "первого шанса", которые попадают в структуру и обрабатываются соответствующим образом. См. этот вопрос для получения дополнительной информации об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...