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