Eventos

[C#] Manejadores Globales de Excepciones

Los Manejadores Globales de Excepciones son eventos de System.Windows.Application (Windows.UI.Xaml.Application para Windows 8) que se disparan cada vez que se lanza un Exception y este no ha sido controlado por el código que se ejecuta en el hilo de ejecución principal, esto significa que si se produce alguna Excepcion en un subproceso no sera tomado en cuenta para este evento, para mayor información sobre subprocesos vease Modelo de subprocesos.

Tengamos en cuenta que para los distintos proyectos los encontramos de las siguientes maneras:

Windows Phone y Silverlight:
public event EventHandler<applicationunhandledexceptioneventargs> UnhandledException;

Windows Presentation Foundation:
public event DispatcherUnhandledExceptionEventHandler DispatcherUnhandledException;

Windows 8:
public event UnhandledExceptionEventHandler UnhandledException;

Para Windows Phone y Silverlight este evento ya viene manejado, sin embargo para WPF y Windows 8 hay que hacerlo por nuestra cuenta. Aca un ejemplo de donde se ubica en Windows Phone:





Implementando DispatcherUnhandledExceptionEventHandler

Cuando creamos nuestro proyecto WPF desde la plantilla WPF Application, nuestro App.xaml.cs se encuentra completamente vacio por asi decirlo, encontes lo que tenemos que hacer es simplemente dejarlo de la siguiente manera:


Y ahora hagamos algo simple como colocar int.Parse("No olviden suscribirse a xamldevelopment.blogspot.com!"); en el constructor del MainWindow y se daran cuenta que la aplicación no se cae, en su lugar sale el mensaje de error. Ahora comenten el e.Handled = true; del App_DispatcherUnhandledException y ya entenderan como es que funciona esto.

2 comentarios:

  1. Sólo como complemento, si ocurre una excepción dentro de un método que se ejecuta en otro thread, entonces el error no es capturado, por ejemplo, al usar BeginInvoke.

    Para que este código funcione, siempre será necesario capturar el error y mandarlo hacia el hilo principal con ExceptionDispatchInfo; esto permitirá mantener el stack trace del error cuando se presente.

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Sergio!

      Muchas gracias por tu aporte. Tienes razon, en .NET 4.5 hay nuevas formas de lidear con los threads como el uso del ExceptionDispatchInfo. Otra forma seria usar por ejemplo System.Threading.Tasks.Task:

      private async void SubscribeWork()
      {
      await Task.Run(() =>
      {
      Thread.Sleep(5000);
      int.Parse("Subscribe");
      });
      }

      Si bien el error ocurre en el Worker Thread, este es enviado automaticamente al hilo principal y ya no es necesario capturar la Exception en una instancia del tipo ExceptionDispatchInfo.

      Para mayor información:
      http://msdn.microsoft.com/en-us/library/dd997415(v=vs.110).aspx
      http://msdn.microsoft.com/en-us/library/dd537614(v=vs.110).aspx

      Saludos.

      Eliminar

Epicalsoft — Superheroic Software Development Blog Designed by Templateism.com Copyright © 2014

Con tecnología de Blogger.