Quel est le meilleur moyen de collecter / signaler les erreurs inattendues dans les applications .NET Window?

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

Question

Je recherche une solution meilleure que celle que nous avons actuellement pour faire face à des erreurs de production inattendues , sans réinventer la roue.

Un grand nombre de nos produits sont des applications WinForm et WPF installées sur des sites distants. Des erreurs inattendues et inattendues se produisent, de NullReferenceExceptions à 'Erreurs réseau générales'. Ainsi, allant des erreurs de programmation aux problèmes d’environnement.

Actuellement, toutes ces exceptions non gérées sont enregistrées à l'aide de log4net, puis renvoyées par courrier électronique pour une analyse . Cependant, nous avons constaté que parfois ces "rapports" d'erreur contenaient trop peu d'informations pour identifier le problème.

Dans ces rapports, nous avons besoin d'informations telles que:

  1. Nom de l'application
  2. Version de l'application
  3. poste de travail
  4. Peut-être une capture d'écran
  5. Détails de l'exception
  6. Système d'exploitation
  7. RAM disponible
  8. Processus en cours
  9. Et ainsi de suite ...

Je ne veux pas vraiment réinventer la roue en le développant à partir de zéro. Composants requis:

  1. Collecte des erreurs (détails mentionnés ci-dessus)
  2. Erreur 'expéditeur' (mise en file d'attente requise si la base de données ou Internet n'est pas disponible)
  3. Base de données d'erreur
  4. Analyse et rapport de ces erreurs. Par exemple. Les 10 erreurs ou délais les plus fréquents se produisent entre 16h00 et 17h00. Comment les erreurs se comparent-elles entre les versions x et y?

Remarque: Nous avons examiné SmartAssembly comme solution possible mais, bien que proche, il ne répondait pas tout à fait à nos besoins et j'espérais Écoutez ce que font les autres développeurs et s'il existe des alternatives.

Modifier: Merci pour les réponses fournies jusqu'à présent. Peut-être que je n’étais pas clair dans ma question initiale, le problème n’est pas de savoir comment intercepter toutes les exceptions non gérées, mais plutôt comment les traiter et créer un moteur de reporting (analyse) autour d’elles.

Était-ce utile?

La solution

Je suggérerais l'article de Jeff Atwood sur la Gestion des exceptions conviviales pour les utilisateurs , qui fait déjà la plupart de ce que vous demandez déjà (informations sur l'application, capture d'écran, détails des exceptions, système d'exploitation, journalisation dans des fichiers texte et envoi de courriers électroniques), et contient le code source afin que vous ajoutiez les éléments supplémentaires dont vous avez besoin.

Autres conseils

Vous pouvez attacher l'événement d'exception non géré et le consigner / accéder à un service Web / etc.

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

J'ai également trouvé cet extrait de code utilisant AppDomain au lieu 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);
        }
    }
}

Voici de la documentation à ce sujet: AppDomain Unhandled Exception

Hormis le simple fait de le gérer vous-même, il n'y a pas vraiment de moyen générique de le faire, mais il faut vraiment l'intégrer correctement à l'interface de l'application, mais vous pouvez configurer un service Web qui prend le nom de l'application, exception, et toutes ces bonnes choses et ont un point centralisé pour toutes vos applications.

Vous voudrez peut-être étudier la fonctionnalité de signalement des erreurs intégrée au lecteur Omea de de JetBrain. Il contient un composant de gestion d'erreur complet qui ouvre une boîte de dialogue lorsqu'une erreur inattendue se produit. L'utilisateur peut entrer plus de détails avant de soumettre le problème au service Web public de collecte des erreurs de JetBrain.

Ils ont créé Omea Open Source pour permettre à la communauté de mettre à niveau la base de code .NET 1.1 vers v2 ou 3. http://www.jetbrains.net/confluence/display/OMEA/this+ lien

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top