Как я могу переопределить диалоговое окно исключения uncaught по умолчанию?
когда исключение остается неучтенным в приложении .NET, виртуальная машина отображает пользователю сообщение об ошибке. Я хотел бы иметь возможность отображать собственное сообщение об ошибке, не ставя catch
блок на верхнем уровне моего приложения (потому что это делает отладку необработанных исключений более утомительной).
прямо сейчас я показываю свой собственный диалог ошибок в AppDomain.UnhandledException
прослушиватель событий, но диалоговое окно .NET-created все еще отображается. Я также хотел бы избежать Environment.FailFast
как это обойдет мой finally
блоки (к которым я все еще несколько привязан).
3 ответов
Если это WinForms, вы должны обрабатывать AppDomain.События unhandledexception и приложение.Threadexceptionметод, чтобы поймать их всех. Некоторые исключения просачиваются в одно, другие-в другое.
здесь был аналогичный (но не точный дубликат) вопрос, который должен помочь:C# - WinForms - обработка исключений для событий
Windows Forms имеет встроенный обработчик исключений, который по умолчанию ловит необработанное управляемое исключение, когда отладчик не подключен, и исключение возникает во время обработки сообщений окна, и jitDebugging = false в приложение.Конфиг. Затем он показывает диалоговое окно конечному пользователю и предотвращает завершение приложения.
вы можете изменить параметр реестра DbgJitDebugLaunchSetting под HKLM\Software\Microsoft\.NetFramework. Это один из три значения, о которых я знаю:
- 0: показывает диалог пользователя с запросом "отладка или завершение".
- 1: позволяет исключение через Для CLR иметь дело с.
- 2: запускает отладчик, указанный в DbgManagedDebugger ключ реестра.
в Visual Studio перейдите в Инструменты > Параметры > отладка > JIT установить ключ 0 или 2. Но значение 1 обычно является тем, что вы хотите на машине конечного пользователя
(см. http://msdn.microsoft.com/en-us/library/2ac5yxx6 (v=против 90).aspx)
Как насчет аналогичной схеме в на WP7?
// Code to execute on Unhandled Exceptions
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
// do stuff
if (System.Diagnostics.Debugger.IsAttached)
{
// An unhandled exception has occurred; break into the debugger
System.Diagnostics.Debugger.Break();
}
}