De forma predeterminada, Windows Presentation Foundation (WPF) detecta las excepciones no controladas, las notifica a los usuarios mediante un cuadro de diálogo (que pueden usar para notificar la excepción) y cierra automáticamente la aplicación.
Sin embargo, si una aplicación necesita procesar las excepciones no controladas de manera personalizada desde una ubicación centralizada, es preciso controlar el evento DispatcherUnhandledException.
Application provoca el evento DispatcherUnhandledException para cada excepción que no es controlada por el código que se ejecuta en el principal subproceso de la interfaz de usuario.
Si una excepción no se controla en un subproceso en segundo plano de la interfaz de usuario (UI) (subproceso con su propio Dispatcher) o un subproceso de trabajo en segundo plano (subproceso sin Dispatcher), no se reenvía al principal subproceso de la interfaz de usuario. Por consiguiente, no se provoca el evento DispatcherUnhandledException. En estas circunstancias, necesitará escribir código para que se realicen las siguientes acciones:
Controlar las excepciones en el subproceso en segundo plano.
Enviar esas excepciones al principal subproceso de la interfaz de usuario.
Volver a producirlas en el principal subproceso de la interfaz de usuario sin controlarlas para que se provoque el evento DispatcherUnhandledException.
Para obtener más información, vea la información general sobre Modelo de subprocesos.
Al controlador de eventos DispatcherUnhandledException se le pasa un argumento DispatcherUnhandledExceptionEventArgs que contiene información contextual sobre la excepción, con los siguientes datos:
Puede utilizar esta información para determinar si la excepción es recuperable o no. Una excepción recuperable podría ser, por ejemplo, la excepción FileNotFoundException, mientras que una excepción irrecuperable podría ser, por ejemplo, la excepción StackOverflowException.
Cuando se procesa una excepción no controlada de DispatcherUnhandledException y se desea que WPF no siga procesándola, es preciso establecer la propiedad Handled en true.
A diferencia de los otros eventos que Application provoca, DispatcherUnhandledException no tiene una implementación virtual protegida correspondiente (OnDispatcherUnhandledException). Por consiguiente, las clases que se derivan de Application siempre deben registrar un controlador de eventos con DispatcherUnhandledException para procesar las excepciones no controladas.