Регистрация UnhandledExceptionEventHandler
с помощью AppDomain.UnhandledException
не означает, что необработанные исключения становятся обработанными.Вместо этого это механизм, позволяющий регистрировать исключение и соответствующее состояние программы, чтобы помочь в дальнейшей отладке.Исключение останется необработанным, и будет генерироваться отчет об ошибках Windows.
В действительности, когда вызывается это событие, «слишком поздно» для обработки исключения.Предполагая, что вы можете указать среде выполнения продолжить выполнение, куда будет выполняться выполнение?Ни один кадр в стеке вызовов не хотел обрабатывать исключение.В лучшем случае исполняющий поток может быть прерван;но что, если это единственный поток переднего плана?Лучше распространить необработанное исключение на фильтр необработанных исключений по умолчанию операционной системы и позволить ему вызывать отчеты об ошибках Windows.
Редактировать с некоторыми дополнительными комментариями:
Теперь некоторые приложения, которые вы хотите создать, будут устойчивыми к сбоямнапример, длительные процессы обслуживания.В некоторых случаях может иметь смысл добавить обработчики исключений «catch-all» *, например, очередь заданий, которая выполняет задания, и не имеет значения, если отдельное задание не выполнено с необработанным исключением;мы регистрируем проблему и переходим к следующей работе.Тем не менее, обработчик корня всеохватывающего типа в Main не имеет смысла: все ваше приложение теперь находится в неизвестном состоянии.Вы можете зарегистрировать исключение и прекратить работу, но вы не сможете воспользоваться преимуществами отчетов об ошибках Windows: посмертные мини-дампы и простая кнопка (кнопка «Отладка» в этом диалоговом окне) для вызова зарегистрированного отладчика JIT, который приметВы прямо к проблеме.Для большинства программ мой совет - просто позволить вашему программному обеспечению рухнуть;Ошибки in-your-face с мини-дампами, как правило, являются одними из самых простых для исправления.
* Некоторые исключения по своей сути являются "неуловимыми", например StackOverflowException
.Другие, такие как AccessViolationException
, являются перехватываемыми, но по своей сути указывают на серьезное несоответствие состояния программы (не удалось прочитать или записать из ожидаемой области памяти).Никогда не стоит пытаться восстанавливаться после таких исключений.