Повсеместная обработка исключений в UI26.06.2025, 09:54. Показов 2572. Ответов 21
Метки нет (Все метки)
Добрый день.
Хотелось бы услышать как кто решает такую задачу: допустим есть некое приложение, которое использует БД или какой-нибудь сетевой ресурс через классы посредники. Получается так, что каждый вызов методов этих посредников надо оборачивать в try чтобы приложение не рухнуло, например при потере сетевого соединения и т.п. Но приложение может быть очень развитым и эти try раздувают код до безобразия. Как такие задачи решаются? Чтобы и исключения ловить и код не раздувать.
0
|
|
| 26.06.2025, 09:54 | |
|
Ответы с готовыми решениями:
21
Обработка исключений. Как организовать общий обработчик исключений? Обработка исключений WCF+обработка исключений. Как это работает? |
|
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,902
|
||||||
| 26.06.2025, 10:01 | ||||||
|
Uswer, так глобальные обработчики исключений же:
0
|
||||||
|
|
|||||||||||
| 26.06.2025, 10:27 | |||||||||||
|
Uswer,
ExceptionHandler Class
в Program:
0
|
|||||||||||
|
|
||
| 26.06.2025, 10:28 | ||
|
То что Usaga написал - это уже "последний выдох" приложения. Шанс залогировать перед закрытием. Но обработчики на то и нужны, чтобы отловить и принять решение - сформировать внятное сообщение, проигнорировать, внести другие изменения, закрыться и т.п. Так что или ты контролируешь процесс работы или код у тебя не раздутый.
4
|
||
|
|
||||||||||||
| 27.06.2025, 12:19 | ||||||||||||
Сообщение было отмечено Uswer как решение
Решение
Я думаю тут многое зависит от того как нужно вести себе приложению, если случилась ошибка. Поэтому подозреваю что единого универсального решения на все случаи жизни нет.
Как вариант для MVVM: написать базовую команду, которая будет иметь общую/расширяемую логику обработки исключений
Может я не прав, но кажись UnhandledException -- это только для случаев когда нет времени делать нормально.
1
|
||||||||||||
|
19 / 18 / 1
Регистрация: 25.05.2025
Сообщений: 39
|
||
| 27.06.2025, 12:46 | ||
|
UPD. При этом полагаться на это событие на 100% не стоит. Насколько я помню, оно реагирует на необработанное исключение в контексте синхронизации (т.е. мониторит конкретный поток выполнения). А если ошибка будет в другом потоке, в т.ч. если в контексте синхронизации вы дополнительно запустите код в новом потоке, в котором и произойдёт исключение, то приложение просто аварийно завершит работу, насколько я помню. Чтобы этого избежать, код любого потока нужно всегда оборачивать в свой отдельный try/catch.
0
|
||
|
|
|
| 27.06.2025, 23:19 | |
|
qwerty.123, скорее вопрос в том, как грамотно прокинуть событие исключения и куда. Это очень частая ошибка, между прочим, и не только у не опытных.
Частенько вижу код задач, в которых исключения выбрасываются "в никуда". И другой пример: некий сервис сам обрабатывает свои исключения, но информация об этом никуда не отправляется, аля: !throw, зато внешний код тоже вызывает этот сервис через try/catch, но что он там получает при ошибке - не понятно. И вроде бы "двойная" защита, а толку ноль.
0
|
|
|
19 / 18 / 1
Регистрация: 25.05.2025
Сообщений: 39
|
||
| 28.06.2025, 10:51 | ||
|
Но порой, конечно, имеет смысл перехватывать исключение и логировать его в самом вызываемом методе - это на усмотрение программиста, смотря по ситуации. Важно, чтобы исключение не было проигнорировано и чтобы позднее можно было узнать о нём (например, увидеть в логе). А если это клиент и сервис, то ошибку, полученную на стороне сервиса при обработке запроса клиента, должны обрабатывать и логировать оба (и сервис, и клиент), каждый на своей стороне, чтобы обе стороны узнали об ошибке и смогли найти расширенную информацию о ней каждый в своём в логе. Логировать каждую ошибку всегда следует с использованием области логирования (log scope), добавляя в неё дополнительную информацию, которая потребуется при исследовании ошибки.
0
|
||
|
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
|
||
| 05.07.2025, 11:22 | ||
|
1) Сделал инфраструктуру для обработки ошибок 2) На главный поток окучил AppDomain.CurrentDomain.UnhandledExcepti on 3) Сделал собственную обёртку Thread 4) Создал с нуля собственную реализацию Taskов с гибким управлением всем, в том числе, обработкой ошибок 5) Сделал свои методы расширения для вызова лямбд и событий и уже на этом всём построен софт. Это страшный гемор, но зато он реально отрабатывает все исключения и не падает из-за них, только логирует. Бонусом идёт трекинг и лёгкий дебаг где какой поток куда запустился, кто какую задачу ждёт и где какой деадлок. В некоторых случаях оно само деадлоки распутывает и разблокирует. Грохнуться может только из-за низкоуровневых косяков типа DirectX/C++, или из-за нехватки памяти. Так что эта задача решаемая, но стоит 10 раз подумать, стоит ли в это ввязываться. Для маленьких проектов это делать не надо.
0
|
||
|
|
||
| 05.07.2025, 12:19 | ||
|
В дедлок программа входит из-за ошибок/невнимательности программиста, например, когда некий поток начинает ожидать чего-то бесконечно..
0
|
||
|
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
|
|||
| 05.07.2025, 12:44 | |||
И вместо Wait() там делается Wait(condition), внутри которого оно в цикле делает Wait() с таймаутом и чекает условие. Если оно поменялось (например, я объект, который должен чего-то там ждать, но поменалось условие - меня выгрузили), то ожидание прерывается. Плюс на все Wait и Set/Reset и прочие семафорсколоковские штуки стоят трекеры на всяких [CallerMemberName/CallerFilePath], оно считает статистику где кто как вызывается и примерно с какой частотой кто кого ждет, и когда что-то идет не так, может просто втупую разблокировать какой-нибудь семафор. Это нарушает логику, но есть шанс что прокатит - ведь ошибки тоже глотаются и логируются.В общем замороченная там штука внутри Это не чинит баги, само собой, но позволяет локализовать ущерб от них. Вместо "сломалось всё" у тебя получается "сломался такой-то кусочек".
0
|
|||
|
|
|
| 05.07.2025, 12:52 | |
|
VBDUnit, ну тут просто надо правильно манипулировать понятиями. В вышеописанном дедлока фактически нет - это просто управляемые задачи, скажем так. Если же произошел настоящий дедлок, то "выкрутиться" из него не получится.
Например, условная кнопка UI запускает некоторую Task-у и ждет ее результата по Task.Result. И сразу же встает на блокировку потока. Эта задача где-то там дальше выполнилась, вернула результат, но поток, вызвавший ее - уже залочен и просто не может ничего принять. Вот это и есть дедлок, который невозможно убрать. Только перезапуском всего приложения.
1
|
|
|
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
|
||
| 05.07.2025, 13:30 | ||
|
В моём случае - ожидание внутри Task палит, что оно в GUI-потоке, и просто разблокируется через 10 сек, вернув default. И пофиг ему, что таймаут не указан. Нельзя блокировать GUI-поток, просто нельзя. И далее конкретно для этого метода для ожидание таски таймаут будет снижен до секунды. Если это был не GUI поток, то оно раз в секунду смотрит какие таски друг друга ждут по всему приложению и строит граф ожиданий. Если палит кольцо, то назначает таймаут, по истечении которого одно из ожиданий завершится с ошибкой.
0
|
||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
|
||
| 05.07.2025, 15:23 | ||
|
Добавлено через 2 минуты Просто сейчас, учитывая что ты героически deadlock-и "разруливал", складывается впечатление, что просто исправлялись свои же собственные адские костыли.
1
|
||
|
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
|
|||
| 05.07.2025, 16:44 | |||
|
1. Можно задавать ApartmentState STA/MTA 2. Можно задавать приоритет потока - разные пулы для каждого приоритета 3. Гарантия моментального старта (0 мс ожидания + в пуле всегда поддерживается несколько свободных потоков + пул не ограничен) - это вообще ключевое и самое важное 4. Опора на собственыне семафоры/ManualResetEventSlim и прочие штуки которые трекают ожидания и не дают виснуть GUI 5. Более удобный механизм отмены 6. Перехват всех исключений при компиляции в Release с автологированием 7. В дебаге задачи запоминают кто их создал (метод, файл, строка, имя и номер потока), кто к ним обращался и кто их ждёт 8. Подсчёт статистики и автоматический перехват мест, где создаётся лавинообразно много задач и их купирование Ну и ещё много чего.
1
|
|||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
|
|||
| 05.07.2025, 17:09 | |||
|
И вроде с отменой проблем быть не должно, все довольно продумано. Можно даже ловить forgotten exceptions в сторонних либах через TaskScheduler.UnobservedTaskException.
1
|
|||
|
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
|
|||
| 05.07.2025, 17:29 | |||
|
0
|
|||
|
Заблокирован
|
|
| 05.07.2025, 17:52 | |
|
Какая то фантастика.
И какая цена за все это по производительности? Спрашиваю как С++плюшник.
0
|
|
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
|
||
| 05.07.2025, 18:15 | ||
|
А .NET традиционно всегда дает оптимальный дефолт, но не во всех сценариях гибок.
0
|
||
| 05.07.2025, 18:15 | |
|
Помогаю со студенческими работами здесь
20
обработка исключений, возникающих из-за ошибочного ввода пользователя обработка исключений до начала работы WCF сервиса Обработка исключений в серверном javascript Обработка исключений при вводе числа, меньшего единицы Обработка исключений при вводе в TextBox недопустимых символов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|