2010-12-12 17 views
5

Estoy buscando la implementación de un simple informe de fallas en mi aplicación que le preguntará al usuario si quiere o no enviarnos el registro de fallas.Informe de bloqueo simple?

Nunca hice un informe de fallos antes, lo que estoy acostumbrado a hacer es intentar/capturar los errores en un archivo de registro.

  1. Cuál es la forma correcta para implementar un sistema de informe de fallos?

  2. ¿Cómo se desencadena el informe de bloqueo para abrir y enviar el volcado cuando se bloquea la aplicación o cuál es la aproximación correcta para enviar los datos?

creo que lo anterior son mis mayores dudas en cuanto a cómo funciona o debería funcionar ... no estoy del todo seguro de si el informe de bloqueo sería un interactúan de try/Fijadores con una aplicación externa cuando trigged lo anterior sucede o cuál sería la forma correcta de seguirlo.

No tengo SQL Server disponible, así que lo que planeaba usar sería un simple script de carga que la aplicación para reportar el volcado utilizaría para enviar los datos.

Disculpe mi ignorancia sobre cómo funciona el informe de fallos y espero que la comunidad pueda ayudarme a comprenderlo mejor.

Estaba buscando información sobre el informe de fallos y vi la mayoría de las cosas en Crystal Report, bibliotecas listas para usar, etc. pero me gustaría empezar de forma pequeña para poder entenderlo mejor antes de acceder a una gran biblioteca u otra solución si está disponible en mi extremo.

Respuesta

3

Mucho depende de la aplicación y (en particular) las preocupaciones sobre la privacidad de los usuarios esperados.

Suponiendo que se trata de una aplicación cliente que se ejecuta en las PC de los usuarios, si se trata de una aplicación interna "intranet", debería ser bastante simple que la aplicación envíe el archivo de registro cuando la aplicación finalice.

Esto puede ser bastante divertido, ya que a veces corregirá el error antes de que los usuarios lo notifiquen.

Alternativamente, si le preocupa que la aplicación puede bloquearse y la excepción no controlada no será capturado correctamente, usted podría

  1. En el inicio, escribir una entrada de registro (o entrada de archivo ficticio, o lo -have-you) que marca "aplicación no finalizada correctamente"
  2. En una salida limpia, limpie la entrada del registro (o lo que-tienes-usted)
  3. Al inicio, verifique si la entrada del registro (etc.) existe.

Si el marcador está presente, entonces sabrá que la aplicación se ha bloqueado de manera no limpia, por lo que puede solicitar al usuario que envíe un mensaje de texto, p. Ej. "La última vez que ejecutó este programa no pareció salir correctamente. ¿Desea enviar un registro de lo que nos sucedió para que podamos intentar solucionar cualquier problema que pueda haber ocurrido?"

+0

+1 para la respuesta. No quiero recopilar información de los usuarios, ya que está funcionando todo lo que quiero es que me envíe un informe de la falla cuando se cuelgue y antes de hacerlo, le preguntará al usuario si quiere o no. Su segundo punto parece una idea que me funcionaría en el momento.Pero, ¿y si el programa ni siquiera comienza para el usuario por un motivo N que no se está manejando y necesito un informe de fallas para investigarlo? – Prix

+0

La respuesta mitch fue buena pero el winqual no se aplica a mí y el segundo enlace nunca funcionó, aparte de eso, esta respuesta me vino mejor ya que no obtuve ninguna otra respuesta que realmente abordara mi pregunta, así que verificaría esto como mi respuesta. – Prix

+1

Ese enfoque funciona solo para saber si la aplicación se bloqueó o no, ¿o no? ¿y si también quiero enviar la excepción? más o menos como lo hace Firefox. – Jack

1

Intente utilizar AppDomain.UnHandledException y/o AppDomain.ThreadException

+0

voy a leer más sobre él para ver cómo funciona gracias por la respuesta. – Prix

6

Ha considerado el uso el incorporado en Windows Error Reporting?

Usted puede utilizar el sitio web Winqual a específica del controlador de vista, aplicación específica, u operar errores específicos del sistema asociados con su organización. Cada informe de error proporciona detalles relacionados con ese segmento , y luego puede solicitar un archivo de los datos asociados.

para ver los informes de error:

  1. establecer una cuenta Winqual. Para proteger a las empresas de la suplantación y para asegurarse de que los informes de errores vayan a un representante de la compañía correcta , el sitio web de Winqual requiere que su empresa tenga un ID de VeriSign válido.

• Consulte con su departamento legal; es posible que su empresa ya tenga un ID de VeriSign (también conocido como Software ID digital del editor para Authenticode). • Consulte en Winqual para ver si su empresa ya tiene una cuenta .

  1. Acepte el acuerdo de informe de errores de Windows.

  2. Inicie sesión en el sitio de Winqual.

  3. Haga clic en Informes de errores de Windows.

Este antiguo artículo puede ser de su interés: A Simple Class to Catch Unhandled Exceptions in WinForms

+0

Winqual es genial, pero no ayuda mucho para los programas administrados, ¿o sí? Recuerdo que principalmente se dirigía al código nativo, no se administraba. –

+0

Acerca de 'Informes de errores de Windows incorporados' Esto parece interesante pero es una aplicación personal que no pertenece a una organización/empresa ¿Sería posible utilizarla para uso personal? – Prix

+0

En lo que respecta al segundo enlace, parece que se trata de lo que estoy tratando de hacer en el momento en que lo intentaré, muchas gracias. – Prix

4

Desplace su propio manejador de excepciones. Use el código siguiente en su clase program.cs. Automáticamente enviará correo cuando ocurra una excepción.

using System; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Mail; 
using System.Threading; 

namespace ExceptionHandlerTest 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.ThreadException += 
       new ThreadExceptionEventHandler(Application_ThreadException); 

      // Your designer generated commands. 
     } 

     static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) 
     { 

      var fromAddress = new MailAddress("your Gmail address", "Your name"); 
      var toAddress = new MailAddress("email address where you want to receive reports", "Your name"); 
      const string fromPassword = "your password"; 
      const string subject = "exception report"; 
      Exception exception = e.Exception; 
      string body = exception.Message + "\n" + exception.Data + "\n" + exception.StackTrace + "\n" + exception.Source; 

      var smtp = new SmtpClient 
      { 
       Host = "smtp.gmail.com", 
       Port = 587, 
       EnableSsl = true, 
       DeliveryMethod = SmtpDeliveryMethod.Network, 
       UseDefaultCredentials = false, 
       Credentials = new NetworkCredential(fromAddress.Address, fromPassword) 
      }; 
      using (var message = new MailMessage(fromAddress, toAddress) 
      { 
       Subject = subject, 
       Body = body 
      }) 
      { 
       //You can also use SendAsync method instead of Send so your application begin invoking instead of waiting for send mail to complete. SendAsync(MailMessage, Object) :- Sends the specified e-mail message to an SMTP server for delivery. This method does not block the calling thread and allows the caller to pass an object to the method that is invoked when the operation completes. 
       smtp.Send(message); 
      } 
     } 
    } 
} 

Puede guardar su tiempo al obtener biblioteca de informe de fallos basado en éste de https://crashreporterdotnet.codeplex.com

+0

¡Esa biblioteca es genial! ¡Gracias! – Jack

Cuestiones relacionadas