#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.Вместо этого необработанное исключение?