У нас есть приложение WPF, где его части могут вызывать исключения во время выполнения. Я хотел бы глобально поймать любое необработанное исключение и зарегистрировать их, но в противном случае продолжить выполнение программы, как будто ничего не произошло (вроде VB On Error Resume Next
).
Возможно ли это в С#? И если да, то где именно мне нужно будет поместить код обработки исключений?
В настоящее время я не вижу ни одной точки, где я мог бы обернуть вокруг try
/catch
вокруг, и который поймал бы все исключения, которые могут произойти. И даже тогда я бы оставил все, что было выполнено из-за улова. Или я думаю в ужасно неправильных направлениях здесь?
ETA:. Потому что многие люди ниже указали: приложение не для управления атомными электростанциями. Если он выйдет из строя, это не так много, но случайные исключения, которые в основном связаны с UI, являются неприятностью в контексте, где он будет использоваться. Были (и, вероятно, все еще) некоторые из них, и поскольку он использует архитектуру плагина и может быть расширен другими (также студенты в этом случае, поэтому нет опытных разработчиков, которые могут писать полностью безошибочный код).
Что касается исключений, которые попадают: я записываю их в файл журнала, включая полную трассировку стека. В этом весь смысл этого упражнения. Просто для того, чтобы противостоять тем людям, которые слишком точно воспринимали мою аналогию с VB OERN.
Я знаю, что слепо игнорирование некоторых классов ошибок является опасным и может испортить мой экземпляр приложения. Как говорилось ранее, эта программа не является критически важной для всех. Никто в здравом уме не поставил бы на него выживание человеческой цивилизации. Это просто небольшой инструмент для тестирования определенных подходов к дизайну. разработки программного обеспечения.
Для немедленного использования приложения не так много вещей, которые могут произойти при исключении:
- Обработка исключений - диалог ошибок и выход приложения. Эксперимент должен быть повторен, хотя, вероятно, с другим предметом. Ошибок не было зарегистрировано, что является неудачным.
- Общая обработка исключений - невосприимчивость к ошибкам, отсутствие вреда. Это должен быть общий случай, который можно судить по всем ошибкам, которые мы наблюдали во время разработки. Игнорирование подобных ошибок не должно иметь немедленных последствий; основные структуры данных проверены достаточно хорошо, чтобы они могли легко выжить.
- Общая обработка исключений - серьезная ошибка в ловушке, возможно, сбой в более поздней точке. Это может произойти редко. Мы этого никогда не видели. Ошибка регистрируется в любом случае, и авария может быть неизбежной. Так что это концептуально похоже на самый первый случай. За исключением того, что у нас есть трассировка стека. И в большинстве случаев пользователь даже не заметит.
Что касается данных эксперимента, созданных программой: серьезная ошибка в худшем случае просто не приведет к тому, что данные не будут записаны. Тонкие изменения, которые изменяют результат эксперимента настолько незначительно, маловероятны. И даже в этом случае, если результаты кажутся сомнительными, была зарегистрирована ошибка; вы можете выбросить эту точку данных, если это общий выброс.
Подводя итог: Да, я считаю себя по-прежнему, по крайней мере, частично нормальным, и я не рассматриваю глобальную процедуру обработки исключений, которая оставляет программу запущенной, чтобы быть полностью злой. Как уже говорилось ранее, такое решение может быть действительным, в зависимости от приложения. В этом случае это было признано действительным решением, а не полным и полным дерьмом. Для любого другого приложения это решение может выглядеть по-другому. Но, пожалуйста, не обвиняйте меня или других людей, которые работали над этим проектом, чтобы потенциально взорвать мир только потому, что мы игнорируем ошибки.
Боковое примечание. Для этого приложения есть ровно один пользователь. Это не что-то похожее на Windows или Office, которые используются миллионами, где стоимость получения исключений для пользователя вообще будет совсем другим.