Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 20.04.2012
Сообщений: 136

GetAsync + Exception

24.04.2023, 01:36. Показов 1017. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер
Не много не понимаю в асинхронности, изучаю

Переписываю код свой же
Есть List адресов, по которым мы получаем ответ. Примерно 5 тысяч урлов
Некоторые из них не валидны, вообще не существуют
Работало циклом, потом параллельным циклом, вот сейчас иду в асинхронность
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 var client = new HttpClient();
                foreach (var item in AllRpc)
                {
                    urls.Add(item+"/statuspage");
                }
 
             
                var requests = urls.Select
    (
        url => client.GetAsync(url)
    ).ToList();
 
                await Task.WhenAll(requests);
 
               
                var responses = requests.Select
    (
        task => task.Result
    );
 
                foreach (var r in responses)
                {
                                       
 
                  
                    var rez = await r.Content.ReadAsStringAsync();
                   
                    Console.WriteLine(rez);
}

И ничего не происходит
Уверен из за того, что какой-то урл возвращает ошибку и все, все ломается, не обработанный экспешен
В режиме отладки раз на раз дорабатывает, пока не попадется нерабочий урл
Пытался в foreach засунуть try-catch, но ошибка то не в этом await
В общем, вопрос
Как отлавливать невалидный урл- да любую ошибку про урлу, и просто ее пропускать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2023, 01:36
Ответы с готовыми решениями:

Unhandled Exception: System.Exception: Неверная последовательность
Подскажите плиз. Решаю курс на степике там задание Напишите функцию Even, возвращающую последовательность чётных неотрицательных чисел...

Ошибка при выполнении GetAsync-метода
Удаленный сервер возвратил ошибку: NotFound, Контракт службы имеет два метода, различие между только в том, что второй метод извлекает...

Гарантирует ли HttpClient.GetAsync моментальную отправку?
Всем привет! У меня вопрос о использовании метода HttpClient.GetAsync - гарантирует ли он моментальную (наискорейшую) отправку запроса?...

9
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
24.04.2023, 02:09
Цитата Сообщение от Sliponn Посмотреть сообщение
Как отлавливать невалидный урл- да любую ошибку про урлу, и просто ее пропускать?
1. Обернуть client.GetAsync(url) в try/catch и логировать.
2. Фильтровать response-ы:
C#
1
2
var responses = requests.Where(r => r.Exception is null).Select(task => task.Result);
var failedRequests = requests.Where(r => r.Exception is not null));
Я бы порекомендовал пробрасывать структуру, куда бы сохранял Task-у и url, с таким подходом можно из failedRequests вытаскивать url-ы, по которым произошли ошибки.
1
0 / 0 / 0
Регистрация: 20.04.2012
Сообщений: 136
24.04.2023, 13:27  [ТС]
Спасибо, но что то не выходит
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 var client = new HttpClient();
                foreach (var item in AllRpc)
                {
                    urls.Add(item+"/statuspage");
                }
 
             
                var requests = urls.Select
    (
        url => client.GetAsync(url)
    ).ToList();
 
                await Task.WhenAll(requests); 
 
                var responses = requests.Where(r => r.Exception is null).Select(task => task.Result);
foreach (var r in responses)
                {
                    // Extract the message body
                   
 
                  
                    var rez = await r.Content.ReadAsStringAsync();
                   
                    Console.WriteLine(rez);
}
метод выполняется за пару секунд, и потом дальше идет, в консоли ничего

Добавлено через 8 минут
Может я не правильно это дело вызываю?
Код выше обернут в

C#
1
2
3
4
public async void PingEndpoits(string type)
        {
 
}
Он находится в отдельном классе

И в мейне я уже вызываю
C#
1
2
            Finder rf = new Finder();
             rf.PingEndpoits("statuspage");
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
24.04.2023, 14:29
Странно, у меня выходит:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// See https://aka.ms/new-console-template for more information
 
Console.WriteLine("Hello, World!");
 
 
var urls = new string[] { "http://ifconfig.io", "http://localhost:8080", "http://localhost:8081"};
 
var client = new HttpClient();
 
var tasks = urls.Select(x => client.GetAsync(x)).ToArray();
var whenAllTask = Task.WhenAll(tasks);
 
try
{
    var result = await whenAllTask;
}
catch(Exception e)
{
    //do nothing here
    // Console.WriteLine(e);    
}
 
var failed = tasks.Where(x => x.Exception is not null).ToArray();
var done = tasks.Where(x => x.Exception is null).Select( async x => await x.Result.Content.ReadAsStringAsync()).ToArray();
 
Console.WriteLine($"Done: {done.Length} (should be 1)\n Failed: {failed.Length} (should be 2)");
foreach (var task in done)
{
    Console.WriteLine("Response content:");
    Console.WriteLine(await task);
}
 
Console.WriteLine();
foreach (var task in failed)
{
    Console.WriteLine($"Failed one: {task.Exception.InnerException.Message}");
}
1
0 / 0 / 0
Регистрация: 20.04.2012
Сообщений: 136
24.04.2023, 20:08  [ТС]
Спасибо, пересобрал проект, обновил фреймворк и заработало
Еще вы сказали, что можно вытаскивать зафейленные урлы, ну и удачные тоже

Как мне соотнести успешный урл с результатом? зафейленный урл с task.id ?

чтоб иметь возмонжость в бд записывать результат

(уже ушел курить линки)
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
24.04.2023, 21:06
Лучший ответ Сообщение было отмечено Sliponn как решение

Решение

Цитата Сообщение от Sliponn Посмотреть сообщение
Еще вы сказали, что можно вытаскивать зафейленные урлы, ну и удачные тоже
Примерно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
readonly struct RequestItem<TResult>
{
    public RequestItem(string url, Task<TResult> task)
    {
        Url = url;
        Task = task;
    }
 
    public string Url { get; }
 
    public Task<TResult> Task { get; }
 
    public Exception Exception => Task.Exception;
}
 
var urls = new[] { "http://ifconfig.io", "http://localhost:8080", "http://localhost:8081" };
 
var client = new HttpClient();
var tasks = urls.Select(x => new RequestItem<HttpResponseMessage>(x, client.GetAsync(x))).ToArray();
 
var whenAllTask = Task.WhenAll(tasks.Select(x => x.Task));
HttpResponseMessage[] result = null;
var failed = Array.Empty<RequestItem<HttpResponseMessage>>();
 
bool withFailures = false;
try
{
    //если ошибок нету, то просто собираем результаты
    result = await whenAllTask;
}
catch (Exception e)
{
    withFailures = true;
    failed = tasks.Where(x => x.Exception is not null).ToArray();
    result = tasks.Where(x => x.Exception is null).Select(x => x.Task.Result).ToArray();
}
 
if (withFailures)
{    
    int counter = 1;
    foreach (var requestItem in failed)
    {
        Console.WriteLine($"{counter++}. Failed one: {requestItem.Url} - {requestItem.Exception.InnerException.Message}");
    }
}
 
Console.WriteLine($"Succeeded requests: {result.Length}");
foreach (var task in result)
{
    Console.WriteLine("Response content:");
    Console.WriteLine(await task.Content.ReadAsStringAsync());
}
Добавлено через 4 минуты
Также необязательно те хосты, до которых смогли достучаться, возвращают удовлетворительный ответ.
Надо проверять еще коды ответов.
0
0 / 0 / 0
Регистрация: 20.04.2012
Сообщений: 136
24.04.2023, 21:40  [ТС]
спасибо, буду курить!
0
0 / 0 / 0
Регистрация: 20.04.2012
Сообщений: 136
16.05.2023, 15:49  [ТС]
Добрый еще раз
Сделал чтоб выдавались урлы не только фейлд,как вы написали, но а так же и гуд урлы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 var client = new HttpClient();
                var tasks = urls.Select(x => new RequestItem<HttpResponseMessage>(x, client.GetAsync(x))).ToArray();
                var whenAllTask = Task.WhenAll(tasks.Select(x => x.Task));
                HttpResponseMessage[] result = null;
               var failed = Array.Empty<RequestItem<HttpResponseMessage>>();
               var resultgood = Array.Empty<RequestItem<HttpResponseMessage>>();
 
 
                bool withFailures = false;
                try
                {
                    result = await whenAllTask;
 
                }
                catch (Exception e)
                {
                    withFailures = true;
                    failed = tasks.Where(x => x.Exception is not null).ToArray();
                    resultgood = tasks.Where(x => x.Exception is null).ToArray();
                }
 
                if (withFailures)
                {
                    int counter = 1;
                    foreach (var requestItem in failed)
                    {
                        Console.WriteLine($"{counter++}. Failed one: {requestItem.Url} - {requestItem.Exception.InnerException.Message}");
                    }
                }
                foreach (var task in resultgood)
                {
                    Console.WriteLine($"URL:{task.Url} | {await task.Task.Result.Content.ReadAsStringAsync()}");
                }
Но есть ощущение что это не верно написано, в частности try как будто бы и не нужен
Моя задача получить ответ + урл, как зафейленый, так и успешный
Код работает что я скинул сейчас, но что то там не то
Буду признателен, если есть минутка посмотреть
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
16.05.2023, 16:17
Цитата Сообщение от Sliponn Посмотреть сообщение
в частности try как будто бы и не нужен
Всмысле не нужен? А как вы узнаете, что произошли ошибки?

Обработка исключений имеет свои нюансы:
Когда Task-а - обычная рабочая лошадка (завершается корректно либо с одной ошибкой), то тут спокойно можно использовать async/await и в случае await-а это единственное исключение внутри AggregateException будет развернуто в свое оригинальное.

Когда же таска не простая, а золотая сложная (в данном случае плоский лист Task-ов), то это будет работать следующим образом:
1. Ожидается завершение всех тасок.
2. Если были ошибки, то перехвачено через async/await будет только та ошибка, Task-а которой была ранее в списке параметров для Task.WhenAll. То есть тайминг тут не важен, важен порядок передачи тасок.
Именно поэтому мы перебираем через фильтр ошибочные таски, проверяя свойство Exception.

Есть еще другой вариант сложной Task-и - tree-like Task-и. Здесь уже важен time-инг, и перехватывать тут исключения нужно уже немного по-другому. (AggregateException.Flatten). Но это уже другая история.
1
0 / 0 / 0
Регистрация: 20.04.2012
Сообщений: 136
16.05.2023, 19:16  [ТС]
Понял вроде бы
В таком случае код что я скинул выше отрабатывает корректно. Не пропустит никаких тасков
Просто ищу подтверждение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2023, 19:16
Помогаю со студенческими работами здесь

Ошибка Unhandled exception at 0x00007FFFC03D06BC Microsoft C++ exception: std::invalid_argument at memor
Итак, цель проста, по клику мыши текст на экране должен заменяться, заменяется он результатом работы функции NextSpeech(), в других...

First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process
Объясните в каких случаях возникает эта ошибка, из-за чего? Как справиться с этой ошибкой? Только плиз на примере и доступными словами, т....

Unhandled exception at 0x7c812a5b : Microsoft C++ exception: std::bad_alloc at memory location 0x0012f350
что то я запутался совсем. подскажите где глюк? Считываю из XML данные: char* ValueVariable(длинная символьная строка) пытаюсь ее...

First chance exception at $646E6970. Exception class $C0000005 with message access violation at 0x646e6970
Перешёл с XE6 на Delphi 10.3 после чего проект перестал запускаться, выдавая ошибку - First chance exception at $646E6970. Exception...

Unhandled exception at at 0x75E717D2 in ConsoleApplication24.exe: Microsoft C++ exception: std::out_of_range at memory l
Здравствуйте, помогите пожалуйста, при проходе через последний цикл выдаёт вот такую ошибку: Unhandled exception at at 0x75E717D2 in...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru