Вопрос: я хочу определить глобальный обработчик исключений для необработанных исключений в моем консольном приложении. В asp.net его можно определить в global.asax, а в приложениях / службах windows - как ниже.
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);
Но как я могу определить глобальный обработчик исключений для консольного приложения?
currentDomain, кажется, не работает (.NET 2.0)?
Редактировать:
Ага, глупая ошибка.
В VB.NET нужно добавить ключевое слово «AddHandler» перед currentDomain, иначе вы не увидите событие UnhandledException в IntelliSense ...
Это потому, что компиляторы VB.NET и C # обрабатывают обработку событий по-разному.
источник
Console.ReadLine()
каких-либо других нарушений потока программ. Но я получаю повторное повышение исключения снова и снова и снова.Если у вас однопоточное приложение, вы можете использовать простую попытку / перехват в функции Main, однако это не распространяется на исключения, которые могут быть выброшены вне функции Main, например, в других потоках (как отмечено в другом Комментарии). Этот код демонстрирует, как исключение может привести к завершению работы приложения, даже если вы пытались обработать его в Main (обратите внимание, как программа корректно завершает работу, если вы нажмете Enter и разрешите приложению корректно завершить работу до возникновения исключения, но если вы позволите ему работать оканчивается довольно несчастно)
Вы можете получить уведомление о том, что другой поток выдает исключение для выполнения некоторой очистки до выхода из приложения, но, насколько я могу судить, из консольного приложения нельзя заставить приложение продолжить работу, если вы не обработали исключение в потоке, из которого он создается без использования каких-либо непонятных параметров совместимости, чтобы приложение работало так же, как в .NET 1.x. Этот код демонстрирует, как основной поток может быть уведомлен об исключениях, поступающих из других потоков, но все равно будет прерван к несчастью:
Поэтому, на мой взгляд, самый простой способ справиться с этим в консольном приложении - убедиться, что каждый поток имеет обработчик исключений на корневом уровне:
источник
Вам также нужно обрабатывать исключения из потоков:
Ой, простите, это было для winforms, для любых потоков, которые вы используете в консольном приложении, вам придется заключить в блок try / catch. Фоновые потоки, которые сталкиваются с необработанными исключениями, не вызывают завершение приложения.
источник
Я только что унаследовал старое консольное приложение VB.NET и мне нужно было настроить Global Exception Handler. Поскольку в этом вопросе несколько раз упоминается VB.NET и он помечен VB.NET, но все остальные ответы здесь приведены на C #, я подумал, что добавлю точный синтаксис и для приложения VB.NET.
Я использовал
REM
маркер комментария вместо единственной кавычки, потому что переполнение стека, казалось, справлялось с подсветкой синтаксиса немного лучшеREM
.источник
То, что вы пытаетесь, должно работать в соответствии с документами MSDN для .Net 2.0. Вы также можете попробовать попробовать / поймать прямо в главном возле вашей точки входа для консольного приложения.
И теперь ваш улов будет обрабатывать все, что не поймано ( в основном потоке ). Это может быть изящно и даже перезапустить, где это было, если вы хотите, или вы можете просто позволить приложению умереть и зарегистрировать исключение. Вы можете добавить, наконец, если вы хотите сделать какую-либо уборку. Каждому потоку потребуется собственная обработка исключений высокого уровня, аналогичная основной.
Отредактировано, чтобы прояснить вопрос о потоках, как указано BlueMonkMN и подробно показано в его ответе.
источник