Вот мой гипотетический пример. У меня очень простое окно WPF с одной кнопкой. Событие Button.Click имеет обработчик, который выглядит следующим образом.
Action doit = () =>
{
Action error = () => { throw new InvalidOperationException("test"); };
try {
this.Dispatcher.Invoke(error, DispatcherPriority.Normal);
} catch (Exception ex) {
System.Diagnostics.Trace.WriteLine(ex);
throw;
}
};
doit.BeginInvoke(null, null);
Я ожидал бы, что исключение будет поймано и записано вызовом Trace.WriteLine
. Вместо этого исключение не попадает и приложение прерывается.
Кто-нибудь знает о возможном объяснении этого? И какое обходное решение вы предлагаете, чтобы поймать исключения, брошенные делегатом, вызванные Dispatcher.Invoke
?
Обновление 1: я положил throw
в код обработки исключений. Я не хочу игнорировать исключение. Весь мой вопрос состоит в том, чтобы справиться с этим правильно. Проблема в том, что код обработки исключений никогда не выполняется.
Помните, что это гипотетический пример. Мой настоящий код не похож на этот. Также предположим, что я не могу изменить код в вызываемом методе.
Обновление 2. Рассмотрим этот пример. Вместо окна WPF у меня есть окно Windows Forms. Он имеет кнопку с почти точно таким же обработчиком. Единственное различие заключается в коде вызова. Это происходит следующим образом.
this.Invoke(error);
В Windows Forms выполняется код обработки исключений. Почему разница?