2010-11-26 13 views
22

Estoy utilizando el siguiente evento para atrapar excepciones no controladas en el hilo de la interfaz de usuario principal.Captura de excepción no controlada en hilos separados

Application.ThreadException 

Desafortunadamente, no detecta los errores no controlados en hilos separados. Soy consciente de

AppDomain.CurrentDomain.UnhandledException 

Sin embargo, esto parece cerrar la aplicación al activarse, mientras que la primera no.

¿Hay alguna forma de manejar excepciones no controladas en hilos separados, sin que se cierre la aplicación?

+6

Sí, asegúrese de que las discusiones no lanzan excepción no controlada. Como dice Eric Lippert: "lo más seguro es suponer que cada excepción no controlada es una excepción fatal o una excepción no controlada. En ambos casos, lo correcto es eliminar el proceso de inmediato". http://blogs.msdn.com/b/ericlippert/archive/2010/11/23/asynchrony-in-c-5-part-eight-more-exceptions.aspx – Ani

+4

Olvidaste la mejor parte de ese artículo: " Como dijo Ripley, cuando las cosas van mal, debes despegar y destruir todo el sitio desde la órbita, es la única forma de estar seguro " –

Respuesta

21

@Ani ya ha respondido a su pregunta. Aunque no estoy de acuerdo con que las excepciones no controladas en los hilos terminen las aplicaciones. El uso de hilos generalmente significa que tiene algún tipo de aplicación de servidor. Reducirlo podría generar una gran cantidad de usuarios enojados.

He escrito un pequeño artículo sobre adecuado manejo de excepciones: http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

Siempre debe capturar las excepciones para las discusiones. Yo suelo usar el siguiente patrón:

void ThreadMethod(object state) 
    { 
     try 
     { 
      ActualWorkerMethod(); 
     } 
     catch (Exception err) 
     { 
      _logger.Error("Unhandled exception in thread.", err); 
     } 
    } 

    void ActualWorkerMethod() 
    { 
     // do something clever 
    } 

Es mucho más fácil de encontrar métodos de rosca que no maneja excepciones correctamente colocándolo en la lógica en un método separado y simplemente mantienen el bloque try/catch en el método de hilo .

+0

Excelente, gracias. –

+1

¿Qué ocurre si la excepción no controlada en otro hilo se genera mediante un método asíncrono privado de un componente de terceros que está utilizando, cómo se puede entender esto? – MC5

+0

No se puede, a menos que la biblioteca de terceros proporcione alguna forma. En cuanto a los métodos de sincronización (Begin/End) necesitas usar catch en ellos. Sin embargo, puede detectar la excepción (pero no rescatar la aplicación) mediante el evento 'AppDomain.UnhandledException'. – jgauffin

1

Sí, tiene que detectar excepciones manualmente en los hilos.

Sin embargo, este código:

void ThreadMethod(object state) 
{ 
    try 
    { 
     ActualWorkerMethod(); 
    } 
    catch (Exception err) 
    { 
     _logger.Error("Unhandled exception in thread.", err); 
    } 
} 

void ActualWorkerMethod() 
{ 
    // do something clever 
} 

se puede simplificar a esto usando PostSharp:

[LogExceptions] 
void ActualWorkerMethod() 
{ 
    // do something clever 
} 
Cuestiones relacionadas