it-swarm.com.ru

Правильная обработка исключений HttpClient в async/await

Я надеялся, что кто-нибудь может немного рассказать мне о проблеме, с которой я сталкиваюсь в отношении обработки исключений async/await с помощью HttpClient. Я написал некоторый код для иллюстрации, и он исполняется как на устройстве Windows Phone 8, так и на эмуляторе:

    private async void SearchButton_Click(object sender, EventArgs e)
    {
        try
        {
            HttpClient client = new HttpClient();
            System.Diagnostics.Debug.WriteLine("BEGIN FAULTY REQUEST:");
            string response = await client.GetStringAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
            System.Diagnostics.Debug.WriteLine("SUCCESS:");
            System.Diagnostics.Debug.WriteLine(response);
        }
        catch (Exception exception)
        {
            System.Diagnostics.Debug.WriteLine("CAUGHT EXCEPTION:");
            System.Diagnostics.Debug.WriteLine(exception);
        }
    }

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

НАЧАТЬ НЕПРАВИЛЬНЫЙ ЗАПРОС:

Исключение типа «System.Net.WebException» произошло в System.Windows.ni.dll и не было обработано до управляемой/собственной границы

Исключение типа «System.Net.WebException» произошло в System.Windows.ni.dll и не было обработано до управляемой/собственной границы

Первое случайное исключение типа «System.Net.Http.HttpRequestException» произошло в mscorlib.ni.dll

Исключение типа «System.Net.Http.HttpRequestException» произошло в mscorlib.ni.dll и не обрабатывалось до управляемой/собственной границы

CAUGHT EXCEPTION: (И здесь он печатает HttpRequestException)

Конечно, я ожидаю ошибки в этом случае, так как URL-адрес, который я вызываю, является ерундой. Здесь я не понимаю, почему отладчик сообщает, что исключения не обрабатываются, когда выходные данные одновременно сообщают, что исключение перехвачено. Кроме того, пользовательский интерфейс приложения становится намного менее отзывчивым во время печати вывода, что указывает на то, что что-то не так.

Разве это не способ обработки исключений при работе с async и await? Я ценю любой вклад! Благодарю.

10
Nils Holtar

Это артефакт отладчика. Он определяет, что исключение «необнаружено», потому что оно не перехвачено пока . В этом случае это ожидаемое поведение.

Вы обрабатываете исключения правильно.

7
Stephen Cleary

Поскольку вы используете HttpClient, попробуйте использовать response.EnsureSuccessStatusCode();

Теперь HttpClient будет генерировать исключение, когда статус ответа не является кодом успеха.

try
{
    HttpResponseMessage response = await client.GetAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
    response.EnsureSuccessStatusCode();    // Throw if not a success code.

    // ...
}
catch (HttpRequestException e)
{
    // Handle exception.
}

ОРИГИНАЛЬНЫЙ ИСТОЧНИК КОДА: http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

25
mirushaki

Отладчик говорит вам, что это исключение - первый шанс. Когда отладчик присоединен к вашему процессу, он получает уведомление о каждом выбрасываемом исключении, а затем на основании того, как отладчик настроен, он решает, что с ним делать. Вы можете пройти Что такое исключение первого шанса? Больше подробностей.

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

0
Anupam