2009-07-25 17 views
6

Si una excepción se propaga hasta la parte superior de mi aplicación (que, por supuesto, nunca sucederá), me gustaría ofrecer la opción de enviar un error informarme antes de que el programa falle. Lo que tengo en mente es incluir todo en la función Principal en un try-catch, y una pequeña clase que envía el seguimiento de la pila y otra información a mi servidor. Suena bastante simple, pero con algo como esto, estoy seguro de que hay obstáculos (como la seguridad, el futuro) que no he considerado en su totalidad..NET "Enviar informe de error a [me]"

¿Existe una biblioteca/proyecto .NET existente para este fin? O, alternativamente, ¿suena esto como el enfoque correcto, simplemente capturando todas las excepciones en el punto de entrada de la aplicación?

+0

usted todavía tiene un problema la captura de excepciones lanzadas por otros hilos :) – cwap

+0

y también hay excpetions inalcanzable; es decir, StackOverflowException;) – Wilhelm

+0

"Si una excepción se propaga hasta la parte superior de mi aplicación (que, por supuesto, nunca sucederá) ..." Olvidaste agregar una carita sonriente para avisarnos que estás bromeando. :) No es una exageración decir que todas las aplicaciones fallan. –

Respuesta

4

Consulte this question en todos los marcos de registro disponibles en .NET, cualquiera de ellos debe ofrecer una notificación por correo electrónico.

Considero que es una buena práctica tener un controlador de excepción de nivel superior que recopile y registre datos sobre excepciones no detectadas. Como Meeh menciona en su comentario a su pregunta, necesita uno para cada tema en su aplicación.

Hay un old article from Joel en la función de informe de errores en FogBugz, tal vez eso le dará más ideas. (Creo que lo leí en su blog, pero todo lo que pude encontrar es esta página de la documentación de FogBugz).

+0

Ese enlace ya no es válido. Trabajo en el siguiente proyecto de código abierto que hace un trabajo increíble recopilando e informando sobre excepciones (https://github.com/exceptionless/Exceptionless) –

1

Utilice las mismas herramientas que usa Windows: Windows Error Reporting (WER). Hará el análisis de bloqueos y clasificará tus fallas para que puedas entender cuáles son las más comunes. No se requieren cambios de código, funciona a nivel de proceso. Registrará los fallos de las excepciones que no puede atrapar.

Suponiendo que se ejecuta en Windows, por supuesto.

+0

¿WER enviará los informes de error al OP? –

+1

No estoy seguro de qué significa OP. WER envía los informes de error a microsoft donde están almacenados. El desarrollador puede recuperarlos periódicamente para su análisis. El único requisito es que el desarrollador se registre en Microsoft y proporcione una firma digital para identificar su código a un costo de varios cientos de dólares. Más aquí: http://en.wikipedia.org/wiki/Windows_Error_Reporting – urig

+0

Póster original. –

1

Mi descargo de responsabilidad estándar: soy un desarrollador de este producto.

Utilizando un producto (Runtime Intelligence) escrito por la empresa para la que trabajo (PreEmptive Soltutions) puede inyectar no solo informes de errores sino también la capacidad de rastrear cuándo los usuarios utilizan sus aplicaciones y qué funciones utilizan con una codificación mínima .

Al usar Dotfuscator para realizar la inyección de código (o tejer IL) insertamos código nuevo en los binarios de la aplicación que envía datos de uso a un servidor alojado en nuestras instalaciones (u opcionalmente a cualquier otra URL arbitraria). Si nos envía los datos, le proporcionamos una serie de poderosas herramientas de análisis e informes sobre el uso.

Se debe incluir una versión básica de esta funcionalidad en Visual Studio 2010, así como acceder a un portal gratuito de informes de datos (pero sin SLA, garantías de retención de datos o privacidad de datos).

La capacidad de enviar datos arbitrarios de vuelta junto con la información de uso se limita al producto comercial, pero puede ponerse en contacto con PreEmptive Soltutions para obtener una versión de evaluación completamente funcional y de tiempo libre.

Usted puede lograr informe de errores con el código de ejemplo siguiente:

public partial class app : Application { 
// field to temporarily store exception data   
    private Exception exp; 
    void AppStartup(object sender, StartupEventArgs args) { 
     // add a handler to catch any unhandled exceptions  
     this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(ErrorHandler); 
     Window1 mainWindow = new Window1(); 
     mainWindow.ShowDialog(); 
    } 

    // this will prompt the user if they want to report the exception 
    void ErrorHandler(object sender, DispatcherUnhandledExceptionEventArgs e) { 
     this.exp = e.Exception; 
     if (MessageBox.Show("A " + exp.Message + " exception happened, should I report it?", "Error Occurrend", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { 
      ErrorHappened(); 
      e.Handled = true; 
     } 
    } 

    // this method is called by the above ErrorHandler method and when run through Dotfuscator additional code will be injected into this method that will send a usage data message back to the server and the data in the dictionary (which will be exception data) returned by the ErrorData method will be included into the message and be stored and reported on the server 
    [Feature("Exception", EventType = FeatureEventTypes.Tick, ExtendedKeySourceElement = SourceElements.Method, ExtendedKeySourceName = "ErrorData")] 
    private void ErrorHappened() { 
     // This is here as a placeholder for the exception feature attribute which will exit the application when executed 
     AppShutdown(true); 
    } 

    // this method takes the exception data from the exp field and returns it as a dictionary of name/value pairs 
    public Dictionary<string, string> ErrorData() { 
     var retval = new Dictionary<string,string>(); 
     if (null != exp) { 
      retval.Add("Error Message",exp.Message); 
      retval.Add("Stack Trace",exp.StackTrace); 
     } 
     return retval; 
    } 
} 
1

he modificado de User-Friendly Exception Handler Jeff y lo actualizó para .NET 2.0/3.5, y he tenido mucha suerte con eso. Si una excepción hace que todo el camino no se maneje, se toma una captura de pantalla y se envía por correo electrónico junto con un seguimiento detallado de la pila al equipo de desarrollo.

1

Trabajo en el proyecto de código abierto Exceptionless que tiene bibliotecas cliente que hacen justamente esto! Capturamos todas las excepciones no controladas y las enviamos a una API de reposo y luego las procesamos en tiempo real.

https://github.com/exceptionless/Exceptionless

Cuestiones relacionadas