Обработчик исключений не вызывается

#c# #exception-handling

#c# #обработка исключений

Вопрос:

Запустив действительно простую программу, приведенную ниже, я ожидаю, что «ДОСТИГНУТ ФИЛЬТР» будет выполняться при нажатии кнопки button1, но он не попадает (ни с подключенным отладчиком, ни без него). Есть идеи … ?

 public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        new Thread(() =>
            {
                Dispatcher.CurrentDispatcher.UnhandledExceptionFilter  = Dispatcher_UnhandledExceptionFilter;
                doer();
            }).Start();
    }
    void Dispatcher_UnhandledExceptionFilter(
        object sender,
        DispatcherUnhandledExceptionFilterEventArgs e)
    {
        MessageBox.Show("FILTER REACHED");
    }


    private void doer()
    {
        throw new NotImplementedException();
    }
}
 

Спасибо

Комментарии:

1. Для меня это немного похоже на C #. В любом случае вы должны пометить этот вопрос языком, о котором вы спрашиваете.

Ответ №1:

Согласно документации Dispatcher (найденной здесь ), похоже, что функция filter будет использоваться только в том случае, если из методов Invoke or BeginInvoke на Dispatcher .

Итак, что произойдет, если вместо этого вы замените doer() на Dispatcher.CurrentDispatcher.Invoke(doer) (или аналогичный)?

Ответ №2:

Вы вызываете метод (исполнитель) из потока, который не является потоком диспетчера .. вы должны вызвать метод с помощью диспетчера, чтобы перехватить исключение для фильтрации.

  new Thread(() =>
            {
                Dispatcher.CurrentDispatcher.UnhandledExceptionFilter  = Dispatcher_UnhandledExceptionFilter;
                 Dispatcher.Invoke(new Action(()=>doer()));
            }).Start();
 

Ответ №3:

попробуйте следующий код

     new Thread(() =>
    {
       Dispatcher.CurrentDispatcher.UnhandledExceptionFilter  = Dispatcher_UnhandledExceptionFilter;
       Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(delegate
       {
           doer();
       }));
    }).Start();
 

Ответ №4:

Вы пробовали использовать AppDomain.Вместо этого необработанное исключение?