Вот мой гипотетический пример. У меня очень простое окно 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 выполняется код обработки исключений. Почему разница?