2009-11-03 23 views
16

Tenemos una interfaz IPoller para la que tenemos varias implementaciones. Tenemos un proceso que tomará un IPoller y lo iniciará en un hilo separado. Estoy tratando de encontrar una forma genérica de proporcionar manejo de excepciones para cualquier IPollers que no lo haga por sí mismo.¿Qué sucede cuando un subproceso de .NET arroja una excepción?

Mi idea original era crear una implementación de IPoller que aceptara un IPoller y solo proporcionara alguna funcionalidad de registro. La pregunta que encontré es cómo voy a proporcionar este manejo de errores? Si tengo IPoller.Start() que es el objetivo para el subproceso, ¿dónde se producirá la excepción? ¿O hay algo en el hilo en el que puedo engancharme?

Respuesta

19

Algo así como:

Thread thread = new Thread(delegate() { 
    try 
    { 
     MyIPoller.Start(); 
    } 
    catch(ThreadAbortException) 
    { 
    } 
    catch(Exception ex) 
    { 
     //handle 
    } 
    finally 
    { 
    } 
}); 

Esto asegurará que la excepción no llegue a la parte superior del hilo.

+0

Es posible que también desee capturar el AppDomainUnloadedException. MSDN: se lanza un AppDomainUnloadedException en un subproceso porque el dominio de aplicación en el que se está ejecutando el subproceso se está descargando. –

9

Debe capturar la excepción en el método que utiliza en la parte superior del hilo, y hacer el registro desde allí.

Una excepción no controlada (en la parte superior de un hilo) matará su proceso (en 2.0 en adelante). No está bien.

es decir, cualquiera que sea el método que se pasa a Thread.Start (etc) deben tener un try/catch, y hacer algo útil en el catch (tala, tal vez apagado ordenado, etc).

Para lograr esto, se podía utilizar:

  • métodos estáticos de registro
  • las variables capturadas en el delegado (como un método anónimo)
  • exponga el método en una instancia que ya se sabe sobre el registrador
3

Tome un vistazo a AppDomain.UnhandledException, que le ayudará a al menos iniciar sesión aquellas excepciones que no se está manejando, y en algunos casos cerrar "muy bien":

Este evento proporciona notificación de excepciones no capturadas. Permite a la aplicación registrar información sobre la excepción antes de que el controlador predeterminado del sistema informe la excepción al usuario y finaliza la aplicación . Si se dispone de suficiente información sobre el estado de la aplicación , otras acciones pueden ser realizadas, como guardar los datos del programa para una recuperación posterior. Se recomienda precaución al , porque los datos del programa pueden corromperse cuando no se manejan las excepciones .

0

excepción Tenga una mirada en

Appdomain.FirstChanceException event

Se da a conocer ningún momento se produce una excepción y CLR está buscando seguimiento de la pila. También los argumentos del evento indican qué tipo de excepción. Puede considerarlo como el lugar central para el registro.

Cuestiones relacionadas