Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
62 / 63 / 28
Регистрация: 10.01.2018
Сообщений: 360

Как реализовать глобальную обработку ошибок/исключений?

22.01.2018, 14:34. Показов 7648. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. На php есть возможность глобально отлавливать все исключения и ошибки, вплоть до фатальных.
Есть ли возможность реализовать такое новичку на с#?

Зачем это мне нужно:
1. Для того чтоб не писать в каждом методе конструкцию try-catch, а то и вовсе try-catch-catch-finaly. Либо if-else.
Из-за чего в итоге проверок выходит больше, чем полезного кода.
2. Для того, чтоб иметь возможность намеренно подавлять вывод сообщений об исключениях в одном месте. Без проверок в каждом catch. И не сообщать пользователю о них поверх всех приложений, з громким оповещением как это, обычно ,делает виндовс. Ну и после этого, например, записать тихо в лог, или вывести в трей. Или вообще ничего не делать и попытаться продолжить выполнение. В зависимости от выбора пользователя.

На всех сайтах и книгах вижу только перехват в пределах одного метода, и ни одного примера о глобальном перехвате.
В коде где много функций для работы с файлами, обработкой пользовательского ввода и получения данных от окон и процессов, это очень нужно. Тк код, из-за проверок всего этого на ошибки, превращается в нечто-из-глубин. Как вообще быть в таком случае.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2018, 14:34
Ответы с готовыми решениями:

Как реализовать глобальную переменную?
Здравствуйте товарищи. есть как бы глобальная переменная int currpos = new int; currpos = 0; currpos = 10; канвас

MVVM приложение. Как правильно реализовать - обработка исключений, DependencyObject, или ещё как-то?
Всем привет, пишу WPF MVVM приложение. Возникла следующая проблема. Короче заполняется паспорт, где вводятся значения в TextBoxы,...

Реализовать обработку ошибок, при этом переопределив, используя наследование события StackOverflowException
Задание: Реализовать обработку ошибок, при этом переопределив с помощью наследования событие: StackOverflowException. Есть иерархия...

15
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
22.01.2018, 14:38
Цитата Сообщение от Sternman Посмотреть сообщение
ни одного примера о глобальном перехвате.
AppDomain.UnhandledException
Application.ThreadException
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
22.01.2018, 14:45
Про Unhandled не забыть что:
система выдает исключение для пользователя и завершает работу приложения
1
62 / 63 / 28
Регистрация: 10.01.2018
Сообщений: 360
22.01.2018, 16:08  [ТС]
insite2012,
Цитата Сообщение от insite2012 Посмотреть сообщение
Application.ThreadException
Делает метод более чистим, но захламляет класс.
Цитата Сообщение от insite2012 Посмотреть сообщение
AppDomain.UnhandledException
Цитата Сообщение от skilllab Посмотреть сообщение
Про Unhandled не забыть что: система выдает исключение для пользователя и завершает работу приложения
Такое себе решение, очень такое себе.

Добавлено через 1 час 11 минут
insite2012,
Цитата Сообщение от Sternman Посмотреть сообщение
Делает метод более чистим, но захламляет класс.
Прошу прощения. Поторопился с выводом, не правильно поняв принцип работы.
И наверное не совсем точно выразил мысль в теме по поводу того что мне нужно. Не могли бы вы подсказать, как реализовать ловлю ошибок в собственном пространстве имен?
Как я понял Application.ThreadException должен быть каждый реализован в основном классе программы.
Но мне хотелось бы реализовать это в собственной dll и чтоб ошибки обрабатывались только те, что генерируются в самом пространстве имен. Но на саму форму и на другие пространства это не должно влиять. Что на подобии обертки для классов, которые находятся внутри, созданного мной пространства. Типа
PHP
1
2
ob_start (); 
ob_end_flush();
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
22.01.2018, 16:38
Цитата Сообщение от skilllab Посмотреть сообщение
Про Unhandled не забыть что:
Ну и не забыть про это:
XML
1
2
3
 <runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
  </runtime>
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
22.01.2018, 22:04
Практически ничего нету, потому что это очень странное решение. Как можно обработать все исключения в одном месте. С тем что каждое исключение привязано к конкретному коду? И как программа может работать дальше если у нее где то возникло исключение, если его не обработать в нужном месте и не восстановить состояние, то скорее всего ваше приложение уже будет сломано, и при каждом следующем действии пользователя у вас будут сыпаться ошибки.

А для тех мест где обработка не особо нужна, например UI: в каждом окне если возникла ошибка, просто достаточно заново забрать состояние модели и все. То для такого решения нужно хорошо продумать архитектуру приложения.

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

Ну и естественно в последнем абзаце речь идет о качественном приложении, в котором ошибки это редкость, а не постоянство.
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
22.01.2018, 22:24
Anklav, совсем чуток забыли о логировании состояния и данных откуда и что. Или это не важно?
Оу, а закрыть файлы для записи если упали при той самой записи? А разорвать соединения с базами чтоб открытые не висели? Ну да..."среда позаботится"
1
Эксперт .NET
 Аватар для Usaga
14100 / 9317 / 1349
Регистрация: 21.01.2016
Сообщений: 34,991
23.01.2018, 14:07
skilllab, вообще-то, ОС сама умеет подчищать за свалившимся приложением начиная с Windows 98. Т.е. за долго до появления .NET. Т.е. и дескрипторы открытых файлов высвободятся и TCP-соединения закроются и память занятая освободится.

Вы бы сами, что ли, проверили, ведь это не сложно.
0
 Аватар для Кузнец кода
169 / 188 / 35
Регистрация: 21.01.2018
Сообщений: 230
23.01.2018, 14:29
Цитата Сообщение от Usaga Посмотреть сообщение
подчищать за свалившимся приложением начиная с Windows 98
Для этого эффективно справляется Grabber Collector, но не совсем есть основные причины когда необходимо принудительно вызвать его:
1) Приложение приступает к выполнению блока кода, прерывание которого возможным процессом сборки мусора является недопустимым.
2)Приложение только что закончило размещать чрезвычайно большое количество объектов и нуждается в как можно скорейшем освобождении большого объема памяти.

В том числе IP соединения они никак на программном уровне не контролируются, если мы рассматриваем как рабочий процесс приложения. А вот при закрытии данного процесса убиваются все взаимосвязанные процессы - это уже вступает вход Windows ОС
0
Эксперт .NET
 Аватар для Usaga
14100 / 9317 / 1349
Регистрация: 21.01.2016
Сообщений: 34,991
23.01.2018, 14:46
Кузнец кода, Grabber Collector?)))))) Если речь про сборщик мусора, то он тут вообще ни причём. Я имел в виду саму ОС, которая знает какие ресурсы использовал процесс, потому не испытывает сложностей с тем, чтобы высвободить их корректным образом в случае аварийного завершения процесса.
0
 Аватар для Кузнец кода
169 / 188 / 35
Регистрация: 21.01.2018
Сообщений: 230
23.01.2018, 15:04
Цитата Сообщение от Usaga Посмотреть сообщение
образом в случае аварийного завершения процесса
Думаю здесь дискуссия должна окончена и вернемся к автору, заданного вопроса. Обработка исключений необходима, если вы не хотите искать в журнале ОС свои ошибки (а там как правило не всегда все понятно). В C# все исключения унаследованы от Exception что позволяет достаточно ловить практически любой Exception
C#
1
2
3
4
5
6
7
8
try
{
..
}
catch (Exception exc)
{
..
}
Как это будет реализовано, то ли messageBox или лог событий, хранящихся в БД это вам решать. Все зависит от бизнес-логики вашей программы.
2
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
23.01.2018, 15:21
Цитата Сообщение от Sternman Посмотреть сообщение
Но мне хотелось бы реализовать это в собственной dll и чтоб ошибки обрабатывались только те, что генерируются в самом пространстве имен. Но на саму форму и на другие пространства это не должно влиять. Что на подобии обертки для классов, которые находятся внутри, созданного мной пространства. Типа
Выбрасывать Exception своего типа, и ловить этот тип/типы.

Есть такое понятие как сквозное(аспектно-ориентированное) программирование. В ASP.NET MVC это доступно "из коробки" в виде фильтров. Для WinForms есть готовые решения, например PostSharp.

Если совсем глобально, то как предлагали выше.
1
62 / 63 / 28
Регистрация: 10.01.2018
Сообщений: 360
23.01.2018, 16:37  [ТС]
Спасибо всем ответившим. Можно считать тему закрытой. Сделал некоторое подобие роутера для сообщений от программы. От проверок избавится не удалось. Но хотя бы основные методы чище стали. При обнаружении ошибки одной строкой передаю в роутер сообщение и код сообщения. Ну, а там уже дальше разбор идет выводить не выводить, модальным окном или в трей, логировать или нет.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
23.01.2018, 16:42
Цитата Сообщение от Usaga Посмотреть сообщение
вообще-то, ОС сама умеет
Ну и славно. Рад, что ошибаюсь аж с 98 года по поводу файлов и портов.

Добавлено через 3 минуты
Добавлю
Цитата Сообщение от Usaga Посмотреть сообщение
подчищать за свалившимся приложением
Не всё вам известно на свете, и не все программы. Я лично использую такую, которая после очередного глобального вылета может остаться висеть в процессах, пока вручную не убьёшь. Ладно, это уже не тема топика. Так что не надо вот прям за все программы на Windows говорить.
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
23.01.2018, 20:03
skilllab, я писал о глобальной обработке исключений, а не о конкретных. Если вы в глобальном месте очищаете ресурсы приложения, то это совершнно плохой подход. Архитектуру приложения проектируют таким образом, чтобы после его закрытия каждый класс сам позпботился о своих ресурсах, что не имеет никакого отношения к глобольной обработке ошибок. Логгирование ошибок кстати тоже не является обработкой. В моем понимании обработка это восстановление состояния приложения после ошибки.

Да, и я как бы не просто так обработку выделил жирным.
0
23.01.2018, 20:17

Не по теме:

skilllab, я говорю за ОС, а не за все программы. То, что программа висеть осталась никак не коррелирует с высказыванием о том, что если не закрыть за собой дескрипторы, то "всё пропало". Убъёте свой процесс - ресурсы высвободятся.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.01.2018, 20:17
Помогаю со студенческими работами здесь

Как правильно производить обработку исключений?
Double x,с; Console.Write(&quot;введите X:&quot;); try { x = Convert.ToDouble(Console.ReadLine()); } ...

Добавить обработку исключений
Для этой программы нужно сделать обработку исключений, через try и catch вроде это делается, но как, я не знаю. Желательно сделать это для...

Нужно сделать обработку исключений
Делаю программу под Windows с использованием форм. Нужно при поиске обрабатывать исключения при вводе числовых данных. public partial...

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru