Как я могу переопределить диалоговое окно исключения 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();
        }
    }