Aquí está mi ejemplo hipotético. Tengo una ventana WPF muy simple con un botón. El evento Button.Click tiene un controlador que va así.¿Por qué las excepciones no son propagadas por WPF Dispatcher.Invoke?
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);
Yo esperaría que la excepción sería capturado y escrito por el llamado Trace.WriteLine
. En cambio, no se captura ninguna excepción y la aplicación se rompe.
¿Alguien sabe de una posible explicación para que esto suceda? ¿Y qué solución sugieres para detectar excepciones lanzadas por el delegado invocado por Dispatcher.Invoke
?
Actualización 1: Puse un throw
en el código de excepción. No quiero ignorar realmente la excepción. El objetivo de mi pregunta es manejarlo correctamente. El problema es que el código de manejo de excepciones nunca se ejecuta.
Recuerde que este es un ejemplo hipotético. Mi código real no se ve así. Además, supongamos que no puedo cambiar el código en el método que se invocará.
Actualización 2: Considere este ejemplo similar. En lugar de una ventana de WPF, tengo una ventana de Windows Forms. Tiene un botón con casi exactamente el mismo controlador. La única diferencia está en el código de invocación. Dice así.
this.Invoke(error);
En Windows Forms, se ejecuta el código de excepción de manejo. ¿Por qué la diferencia?
La forma en que trato las excepciones detectadas es irrelevante. Podría poner algo de registro o lo que sea allí. El problema es que el código de manejo de excepciones nunca se ejecuta. – jpbochi
Eso es porque la excepción se lanza en otro hilo: el hilo 'Dispatcher'. –
@Sthepen: Lo sé. Esperaba obtener una TargetInvocationException o algo así. – jpbochi