2008-09-21 16 views
6

Estoy buscando una solución mejor que la que tenemos actualmente para hacer frente a errores inesperados de producción, sin reinventar la rueda.¿Cuál es la mejor forma de recopilar/informar errores inesperados en aplicaciones de ventana .NET?

Una mayor cantidad de nuestros productos son aplicaciones WinForm y WPF que se instalan en sitios remotos. Inevitablemente se producen errores inesperados, desde NullReferenceExceptions hasta 'Errores generales de red'. Por lo tanto, abarca desde errores del programador hasta problemas ambientales.

Actualmente todas estas excepciones no controladas se registran usando log4net y luego se envían por correo electrónico a nosotros para el análisis . Sin embargo, encontramos que a veces estos 'informes' de error contienen muy poca información para identificar el problema.

En estos informes que necesitan información, tales como:

  1. Nombre de la aplicación
  2. Versión de la aplicación
  3. estación de trabajo
  4. Tal vez una captura de pantalla
  5. Detalles de la excepción
  6. sistema operativo
  7. RAM disponible
  8. procesos que se ejecutan
  9. y así sucesivamente ...

que realmente no quieren reinventar la rueda mediante el desarrollo de esto desde el principio. Componentes que se requieren:

  1. colección de errores (detalles como se mencionó anteriormente)
  2. error 'emisor' (Queuing necesario si DB o Internet no está disponible)
  3. base de datos de error
  4. Análisis y presentación de informes de estos errores . P.ej. Los 10 errores o tiempos de espera más frecuentes ocurren entre las 4:00 p.m. y las 5:00 p.m. ¿Cómo se comparan los errores entre la versión x y y?

Nota: nos fijamos en SmartAssembly como una posible solución, pero aunque está cerca no bastante cumplió con nuestras necesidades y que estaba esperando escuchar lo que otros desarrolladores hacen y si existen algunas alternativas.

Edit: Gracias por las respuestas hasta el momento. Tal vez no estaba claro en mi pregunta original, el problema no es cómo atrapar todas las excepciones sin manos sino cómo lidiar con ellas y crear un motor de informes (análisis) a su alrededor.

+0

Hola, estoy interesado en qué era lo que significaba que Smartassembly no acababa de satisfacer ¿tus necesidades? –

Respuesta

5

Sugeriría el artículo de Jeff Atwood en User Friendly Exception Handling, que hace la mayor parte de lo que ya solicita (información de la aplicación, captura de pantalla, detalles de excepción, sistema operativo, registro en archivos de texto y correo electrónico) y contiene el código fuente para que pueda agregar cosas extra que necesitas

+0

Gracias a esto un paso en la dirección correcta. Leí el artículo y proporciona una solución a una parte del problema (recopilación de errores). Como mencionó, necesita trabajo para nuestras necesidades específicas, pero al menos proporciona un buen comienzo. Espero que exista algo más para analizar estos errores. –

2

Puede adjuntar al evento de excepción no controlada e iniciar sesión/acceder a un servicio web/etc.

[STAThread] 
static void Main() 
{ 
    Application.ThreadException += new ThreadExceptionEventHandler(OnUnhandledException); 
    Application.Run(new FormStartUp()); 
} 
static void OnUnhandledException(object sender, ThreadExceptionEventArgs t) 
{ 
    // Log 
} 

También encontré este fragmento de código usando dominio de aplicación en lugar de ThreadException:

static class EntryPoint { 
    [MTAThread] 
    static void Main() { 
     // Add Global Exception Handler 
     AppDomain.CurrentDomain.UnhandledException += 
      new UnhandledExceptionEventHandler(OnUnhandledException); 

     Application.Run(new Form1()); 
    } 

    // In CF case only, ALL unhandled exceptions come here 
    private static void OnUnhandledException(Object sender, 
     UnhandledExceptionEventArgs e) { 
     Exception ex = e.ExceptionObject as Exception; 
     if (ex != null) { 
      // Can't imagine e.IsTerminating ever being false 
      // or e.ExceptionObject not being an Exception 
      SomeClass.SomeStaticHandlingMethod(ex, e.IsTerminating); 
     } 
    } 
} 

Aquí es parte de la documentación sobre el mismo: AppDomain Unhandled Exception

Fuera de solo manejar por sí mismo, no es realmente una forma genérica de hacer esto que sea reutilizable, realmente debe integrarse correctamente con la interfaz de la aplicación, pero podría configurar un servicio web que tome el nombre de la aplicación, la excepción y todas esas cosas buenas y tenga un punto centralizado para todos tus aplicaciones.

0

Es posible que desee estudiar la función de informe de errores integrada en el Omea Reader de JetBrain. Tiene un componente de manejo de errores catch-all que aparece un diálogo cuando ocurre un error inesperado. El usuario puede ingresar más detalles antes de enviar el problema al servicio web público de colección de errores de JetBrain.

Hicieron código abierto Omea para permitir que la comunidad de actualizar la base de código .NET 1.1 a la versión 2 o 3. http://www.jetbrains.net/confluence/display/OMEA/this+link

Cuestiones relacionadas