WPF - DispatcherUnhandledException, похоже, не работает - PullRequest
9 голосов
/ 24 декабря 2008

Я запустил новый проект WPF в VS2008, а затем добавил немного кода в ловушку DispatcherUnhandledException. Затем я добавил исключение броска в Window1 но ошибка не перехватывается обработчиком. Почему?

   public App()
    {
        this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);

    }

    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        System.Windows.MessageBox.Show(string.Format("An error occured: {0}", e.Exception.Message), "Error");
        e.Handled = true;
    }

 void Window1_MouseDown(object sender, MouseButtonEventArgs e)
    {
        throw new NotImplementedException();
    }

Ответы [ 5 ]

4 голосов
/ 24 декабря 2008

Это может произойти из-за того, как у вас есть отладчик, обрабатывающий исключения - Debug / Exceptions ... должен позволить вам точно настроить, как вы хотите, чтобы он обрабатывался.

3 голосов
/ 03 декабря 2009

Посмотрите на следующую ссылку MSDN http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx Здесь уместно

Если исключение не обрабатывается ни в потоке фонового пользовательского интерфейса (поток с его собственным Dispatcher), ни в фоновом рабочем потоке (поток без Dispatcher), исключение не перенаправляется в основной поток UI , Следовательно, DispatcherUnhandledException не вызывается. В этих условиях вам нужно будет написать код для выполнения следующих действий:

  1. Обрабатывать исключения в фоновом потоке.
  2. Отправка этих исключений в основной поток пользовательского интерфейса.
  3. Перенесите их в основной поток пользовательского интерфейса, не обрабатывая их, чтобы можно было вызвать DispatcherUnhandledException.
2 голосов
/ 02 марта 2016

Вот как я справляюсь. Это не красиво, но имейте в виду, что ошибки такого типа никогда не должны проходить отладку как разработчик. Эти ошибки должны быть исправлены до того, как вы приступите к работе (так что ничего страшного). В проекте автозагрузки в коде App.xaml (App.xaml.cs) я поместил следующий код.

  • OnStartup, создать обработчик события DispatcherUnhandledException
  • В обработчике используйте MessageBox для отображения сообщения. Обратите внимание, что, скорее всего, окно запуска еще не создано, поэтому не пытайтесь поместить его в окно.
  • е. Исправить ошибку
  • Мне нравится видеть, когда появляются дополнительные внутренние ошибки, поэтому я продолжаю вызывать окно дисплея, пока внутренняя ошибка не станет нулевой.

Я не уверен, почему специальные символы блока кода не форматируют это правильно. Извините за это.

protected override void OnStartup(StartupEventArgs e)
    {
        // define application exception handler
        Application.Current.DispatcherUnhandledException += 
            AppDispatcherUnhandledException;

        // defer other startup processing to base class
        base.OnStartup(e);
    }

    private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        runException(e.Exception);

        e.Handled = true;   
    }

    void runException(Exception ex)
    {
        MessageBox.Show(
            String.Format(
                "{0} Error:  {1}\r\n\r\n{2}",
                ex.Source, ex.Message, ex.StackTrace,
                "Initialize Error",
                MessageBoxButton.OK, 
                MessageBoxImage.Error));

        if (ex.InnerException != null)
        {
            runException(ex.InnerException);
        }
    }
2 голосов
/ 16 апреля 2009

Сначала даже вне среды отладки мой обработчик, похоже, не срабатывает ..... потом я понял, что забыл установить e.Handled = true.

По правде говоря, это работало, но из-за того, что e.Handled все еще был ложным, стандартный обработчик исключений все же включился и сделал свое дело.

Как только я установил e.Handled = true, тогда все было просто ужасно. Так что, если это не работает для вас, убедитесь, что вы сделали этот шаг.

1 голос
/ 24 декабря 2008

Для интересующихся

Похоже, что среда IDE по-прежнему работает с исключениями, и если вы нажмете продолжить в IDE, она вызовет обработчик ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...