2008-12-24 10 views
9

Inicié un nuevo proyecto WPF en VS2008 y luego agregué un código para interceptar DispatcherUnhandledException. Luego agregué una excepción de tiro al Window1 pero el controlador no atrapó el error. ¿Por qué?WPF - DispatcherUnhandledException no parece funcionar

public App() 
    { 
     this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); 

    } 

    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     System.Windows.MessageBox.Show(string.Format("An error occured: {0}", e.Exception.Message), "Error"); 
     e.Handled = true; 
    } 

void Window1_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

Respuesta

5

Esto puede suceder debido a la forma en que tiene las excepciones de depuración de depuración - Debug/Exceptions ... debería permitirle configurar exactamente cómo desea que se maneje.

1

Para aquellos interesados ​​

Parece que el IDE sigue rompiendo sobre las excepciones y que si hace clic en continuar en el IDE se llama el gestor de errores.

2

Al principio, incluso fuera del entorno de depuración, mi controlador no parece estar activando ..... entonces me di cuenta de que olvidé establecer e.Handled = true.

En verdad, funcionaba, pero como e.Handled todavía era falso, el manejador de excepciones estándar aún se lanzaba e hizo lo suyo.

Una vez que configuré e.Handled = true, todo fue Hunky Dory. Entonces, si no funciona para usted, asegúrese de haber hecho ese paso.

3

Mira siguiente enlace de MSDN http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx siguiente es relevante aquí

Si una excepción no se maneja bien en un subproceso de interfaz de fondo de usuario (UI) (un hilo con su propio despachador) o un subproceso de trabajo de fondo (una subproceso sin un Dispatcher), la excepción no se reenvía al subproceso principal de la interfaz de usuario. En consecuencia, DispatcherUnhandledException no se genera. En estas circunstancias, deberá escribir el código para hacer lo siguiente:

  1. Manejar excepciones en la cadena de fondo.
  2. Despacha esas excepciones al subproceso principal de la interfaz de usuario.
  3. Vuelva a colocarlos en la hebra de la interfaz de usuario principal sin manipularlos para permitir que se genere DispatcherUnhandledException.
+4

Excepto que el código en la lista arroja la excepción en el hilo principal de la interfaz de usuario. – svick

+0

degradado ... porque en el ejemplo se lanza la excepción en el hilo principal –

0

Así es como lo manejo. Esto no es bonito, pero tenga en cuenta que este tipo de error nunca debe pasar la depuración como un desarrollador. Esos errores deberían resolverse por mucho tiempo antes de que vayas a producción (así que está bien que esto no sea bonito). En el proyecto de inicio, en el código de App.xaml (App.xaml.cs) detrás, coloco el siguiente código.

  • OnStartup, crear un controlador de eventos DispatcherUnhandledException
  • En el controlador, utilice un cuadro de mensaje para mostrar el mensaje. Tenga en cuenta que es probable que la ventana de inicio aún no se haya creado, así que no intente ponerla en una ventana.
  • e.Manipule el error
  • Me gusta ver cuando hay errores internos adicionales, así que sigo llamando a la ventana de visualización hasta que el error interno sea nulo.

No estoy seguro de por qué los caracteres especiales del bloque de código no están formateando esto correctamente. Lo siento por eso.

protected override void OnStartup(StartupEventArgs e) 
    { 
     // define application exception handler 
     Application.Current.DispatcherUnhandledException += 
      AppDispatcherUnhandledException; 

     // defer other startup processing to base class 
     base.OnStartup(e); 
    } 

    private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     runException(e.Exception); 

     e.Handled = true; 
    } 

    void runException(Exception ex) 
    { 
     MessageBox.Show(
      String.Format(
       "{0} Error: {1}\r\n\r\n{2}", 
       ex.Source, ex.Message, ex.StackTrace, 
       "Initialize Error", 
       MessageBoxButton.OK, 
       MessageBoxImage.Error)); 

     if (ex.InnerException != null) 
     { 
      runException(ex.InnerException); 
     } 
    } 
Cuestiones relacionadas