try manejo errores ejemplo catch c# exception-handling

ejemplo - manejo de errores c#



Captura de excepciones no manejadas en hilos separados (3)

@Ani ya ha respondido tu pregunta. Aunque no estoy de acuerdo con que las excepciones no controladas en los subprocesos deben terminar las aplicaciones. Usando subprocesos usualmente significa que tienes algún tipo de aplicación de servidor. Bajarlo podría resultar en muchos usuarios enojados.

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

Siempre debes atrapar excepciones para los hilos. Usualmente uso 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 encontrar métodos de subprocesos que no manejen las excepciones de manera adecuada moviendo la lógica a un método separado y manteniendo el bloque try / catch en el método de subprocesos.

Estoy usando el siguiente evento para detectar excepciones no manejadas en el hilo principal de la interfaz de usuario.

Application.ThreadException

Desafortunadamente, no detecta esos errores no manejados en hilos separados. Estoy consciente de

AppDomain.CurrentDomain.UnhandledException

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

¿Hay una manera de lidiar con las excepciones no manejadas en hilos separados, sin que la aplicación se cierre?


Por supuesto que siempre debe manejar todas las excepciones. Pero si actualmente no puedes hacerlo, puedes intentar lo siguiente:

La aplicación se bloqueará / cerrará después del controlador de eventos UnhandledException . Simplemente puede agregar un retraso en el controlador de eventos para evitar esto. Otros hilos sin excepción (por ejemplo, el hilo principal) pueden continuar. Así que la aplicación no se cerrará y puede continuar. Sin embargo, el hilo con la excepción permanecerá en reposo. Y por lo tanto, puede obtener una "pérdida de memoria / hilo".

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { // Log the exception, display it, etc Debug.WriteLine((e.ExceptionObject as Exception).Message); Thread.Sleep(100000000); }

En este momento no hay una mejor solución. Puede encontrar cambiar el archivo de configuración, pero creo que está tan sucio: https://.com/a/15348736


Sí, tienes que capturar manualmente las excepciones 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 }