Por que exceções não são propagadas pelo WPF Dispatcher.Invoke?
Aqui está o meu exemplo hipotético. Eu tenho uma janela WPF muito simples com um botão. O evento Button.Click possui um manipulador que é assim.
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);
Eu esperaria que a exceção fosse capturada e anotada peloTrace.WriteLine
ligar. Em vez disso, nenhuma exceção é capturada e o aplicativo é interrompido.
Alguém sabe de uma possível explicação para isso acontecer? E que solução alternativa você sugere para capturar exceções lançadas pelo delegado invocado porDispatcher.Invoke
?
Atualização 1: Eu coloquei umthrow
no código de manipulação de exceção. Na verdade, não quero ignorar a exceção. O ponto principal da minha pergunta é lidar com isso corretamente. O problema é que o código de manipulação de exceção nunca é executado.
Lembre-se de que este é um exemplo hipotético. Meu código real não é assim. Além disso, suponha que eu não possa alterar o código no método a ser chamado.
Atualização 2: Considere este exemplo semelhante. Em vez de uma janela WPF, eu tenho uma janela Windows Forms. Ele tem um botão com quase o mesmo manipulador. A única diferença está no código de chamada. É assim.
this.Invoke(error);
No Windows Forms, o código de manipulação de exceção é executado. Por que a diferença?