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