До сих пор, я просто поставить попробовать / поймать блок вокруг Application.Run
вProgram.cs
точке входа в программу. Это достаточно хорошо улавливает все исключения в режиме отладки, но когда я запускаю программу без режима отладки, исключения больше не обрабатываются. Я получаю поле необработанного исключения.
Я не хочу, чтобы это случилось. Я хочу, чтобы все исключения перехватывались при работе в режиме без отладки. Программа имеет несколько потоков, и желательно, чтобы все исключения из них перехватывались одним и тем же обработчиком; Я хочу регистрировать исключения в БД. Есть ли у кого-нибудь совет, как это сделать?
источник
В NET 4 определенные исключения больше не перехватываются по умолчанию; как правило, это исключения, которые указывают на (возможно, фатальное) поврежденное состояние исполняемого файла, например AccessViolationException.
Попробуйте использовать тег [HandleProcessCorruptedStateExceptions] перед основным методом, например
using System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions [HandleProcessCorruptedStateExceptions] public static int Main() { try { // Catch any exceptions leaking out of the program CallMainProgramLoop(); } catch (Exception e) // We could be catching anything here { System.Console.WriteLine(e.Message); return 1; } return 0; }
источник
AppDomain.CurrentDomain.UnhandledException
иApplication.ThreadException
тоже с[HandleProcessCorruptedStateExceptions]
тегом?Хороший пример можно найти на http://www.csharp-examples.net/catching-unhandled-exceptions/ По сути, измените свой основной на:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.Run(new Form1()); } static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception"); } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception"); }
источник
Для этого вы можете использовать библиотеку NBug . С минимальной настройкой вроде этого:
NBug.Settings.Destination1 = "Type=Mail;From=me@mycompany.com;To=bugtracker@mycompany.com;SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.ThreadException += NBug.Handler.ThreadException;
Вы можете начать сбор информации обо всех необработанных ошибках в вашем приложении, даже когда оно развернуто для клиентов. Если вы не хотите использовать стороннюю библиотеку, вы должны прикрепить к событиям ниже:
// These two should come before enabling visual styles or running the application AppDomain.CurrentDomain.UnhandledException += ... Application.ThreadException += ... ... Application.Run(new Form1());
источник
Check Online for a Solution
ИлиClose the Program
... и т.д. Но если я НЕ подписываюсь, я получаю обычное общее .NET Unhandled Exception Окно. Это происходит в сборках Release и Debug, также пробовал установитьApplication.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
ничего не меняет.