2011-03-14 13 views
6

¿Cuál es la mejor forma (solución estándar) de construir recuperación de fallos en mi aplicación para que pueda reiniciarse automáticamente en cualquier tipo de bloqueo.Recuperación tras error en la aplicación

tnx.

+0

¿Tiene algún estado en su aplicación? –

+0

Lo siento, "estado"? – MBZ

+0

Estado, como vista actual, cambios no guardados, historial de navegación, todo sobre qué y dónde es "la aplicación" y qué ha creado el usuario. –

Respuesta

6

Tiene algunas opciones aquí.

El primero (y el mejor) es agregar algún tipo de manejo de error global que captará cualquier excepción no detectada y tratará con ellas adecuadamente. A lo largo de estas líneas, debería comenzar a agregar el manejo específico de excepciones apropiado a su base de códigos. Tenga en cuenta que el desbordamiento de la pila y ciertas excepciones de seguridad y memoria superarán cualquier manejo global independientemente.

Una segunda opción es tener un servicio de monitorización que solo pruebe si la aplicación actual todavía está funcionando. Si no es así, fuerce a matar la aplicación existente y reinicie una nueva instancia.

Una tercera opción es separar la aplicación en dos aplicaciones. Una aplicación externa tipo "contenedor" que simplemente ejecuta el otro proceso. La aplicación contenedora no tendrá una IU, pero comenzará el proceso principal y lo verá (al igual que la opción 2 anterior). He visto este usado en varias aplicaciones "modulares".

El punto es que la única manera real de hacerlo es tener 2 aplicaciones: una para monitorear, la otra para hacer la interfaz de usuario y todo lo demás.

+4

Un 'controlador' de error global no puede manejar muchos errores, ya que raramente tiene suficiente contexto para saber si es seguro continuar (es decir, si el estado de la aplicación sigue siendo válido.) Para lidiar con bloqueos verdaderos (excepciones que no pudieron o no fueron manejadas en una capa apropiada), voto por la solución del proceso de alojamiento, que comienza y finaliza con el proceso principal. En .NET, esto a menudo se puede lograr de forma limpia mediante el uso de un dominio de aplicación separado para la aplicación alojada, en lugar de requerir un proceso completamente separado. –

0

Ponga su estado persistente en algo que admita transacciones. P.ej. Base de datos (sqlite) o si las necesidades no son demasiado complejas, utilice copy on write (escriba changes en un archivo nuevo y solo si fue exitoso descarte el archivo anterior)

Estas sugerencias son muy genéricas.

10

En general, es mejor no hacer esto, no hay nada de bonito en un proceso que se inicia constantemente y se bloquea de inmediato con el usuario mirando impotentemente la carnicería. Pero solo puedo entregarte las balas, apuntar el arma a tu pie depende de ti. Usted necesitará un código como éste:

static void Main(string[] args) { 
     AppDomain.CurrentDomain.UnhandledException += ReportAndRestart; 
     // etc.. 
    } 

    static void ReportAndRestart(object sender, UnhandledExceptionEventArgs e) { 
     string info = e.ExceptionObject.ToString(); 
     // Log or display info 
     //... 
     // Let the user know you're restarting 
     //... 
     // And restart: 
     System.Diagnostics.Process.Start(
      System.Reflection.Assembly.GetEntryAssembly().Location, 
      string.Join(" ", Environment.GetCommandLineArgs())); 
     Environment.Exit(1); 
    } 
} 

Mira que tomé un acceso directo en los argumentos de línea de comandos. Deberían citarse si contienen una ruta a un archivo que contiene espacios. No tome atajos en el código que se supone que debe poner en la elipsis.

+0

Una solución al proceso de bloqueo constantemente reiniciado que usa Windows Services es un límite en el número de veces que intentará reiniciar el proceso. Esto funciona mejor cuando tiene un proceso externo de "hosting" que monitorea la aplicación lanzada y por lo tanto puede mantener el estado de sus fallas. Esto funciona mejor para los servicios que una aplicación basada en la interfaz de usuario, sin embargo, como mínimo con los servicios, el bloqueo y el reinicio son en su mayoría transparentes para el usuario. –

+0

¿Qué hay de la recuperación del estado de la aplicación? Cada unidad podría tener un estado que es crucial para la continuación de la aplicación. – Arijoon

Cuestiones relacionadas