Qual è il modo migliore per raccogliere / segnalare errori imprevisti nelle applicazioni .NET Window?

StackOverflow https://stackoverflow.com/questions/110488

Domanda

Sto cercando una soluzione migliore di quella che attualmente dobbiamo affrontare con errori di produzione imprevisti , senza reinventare la ruota.

Un numero maggiore dei nostri prodotti sono applicazioni WinForm e WPF installate in siti remoti. Si verificano inevitabilmente errori imprevisti, da NullReferenceExceptions a "Errori di rete generali". Pertanto, dagli errori del programmatore ai problemi ambientali.

Attualmente tutte queste eccezioni non gestite vengono registrate utilizzando log4net e quindi inviate via e-mail a noi per analisi . Tuttavia, abbiamo scoperto che a volte questi "rapporti" di errore contengono informazioni insufficienti per identificare il problema.

In questi rapporti abbiamo bisogno di informazioni come:

  1. Nome dell'applicazione
  2. Versione dell'applicazione
  3. Stazione di lavoro
  4. Forse una schermata
  5. Dettagli eccezione
  6. Sistema operativo
  7. RAM disponibile
  8. Processi in esecuzione
  9. E così via ...

Non voglio davvero reinventare la ruota sviluppandola da zero. Componenti richiesti:

  1. Raccolta errori (dettagli come menzionato sopra)
  2. Errore "mittente" (Accodamento richiesto se DB o Internet non sono disponibili)
  3. Database errori
  4. Analisi e segnalazione di questi errori. Per esempio. 10 errori o timeout più frequenti si verificano tra le 16:00 e le 17:00. Come si confrontano gli errori tra la versione xey?

Nota: Abbiamo considerato SmartAssembly come una possibile soluzione, ma sebbene vicino non ha soddisfatto le nostre esigenze e speravo di sentire cosa fanno gli altri sviluppatori e se esistono alternative.

Modifica: Grazie per le risposte finora. Forse non ero chiaro nella mia domanda originale, il problema non è come catturare tutte le eccezioni non gestite, ma piuttosto come gestirle e creare un motore di reporting (analisi) attorno a loro.

È stato utile?

Soluzione

Suggerirei l'articolo di Jeff Atwood su Gestione delle eccezioni intuitiva , che fa la maggior parte di ciò che chiedi già (Informazioni sull'applicazione, Screenshot, Dettagli delle eccezioni, Sistema operativo, Registrazione su file di testo e invio tramite e-mail) e contiene il codice sorgente in modo da aggiungere tutto ciò di cui hai bisogno.

Altri suggerimenti

È possibile collegarsi all'evento di eccezione non gestita e registrarlo / accedere a un servizio Web / ecc.

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

Ho trovato anche questo frammento di codice usando AppDomain invece di 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);
        }
    }
}

Ecco un po 'di documentazione: AppDomain Unhandled eccezione

Oltre a gestirlo da soli, non c'è davvero un modo generico per farlo che sia riutilizzabile, deve davvero essere integrato con l'interfaccia dell'applicazione correttamente, ma è possibile impostare un servizio Web che prende il nome dell'applicazione, eccezione e tutte quelle cose buone e hanno un punto centralizzato per tutte le tue app.

Potresti voler studiare la funzionalità di segnalazione errori integrata in Omea Reader di JetBrain. Dispone di un componente per la gestione degli errori che apre una finestra di dialogo quando si verifica un errore imprevisto. L'utente può inserire ulteriori dettagli prima di inviare il problema al servizio web di raccolta errori pubblico di JetBrain.

Hanno reso Omea open source per consentire alla community di aggiornare la base di codice .NET 1.1 alla v2 o 3. http://www.jetbrains.net/confluence/display/OMEA/this+ link

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top