2009-07-23 7 views
2

Je développe une application winforms et j'aimerais savoir quelles sont les meilleures pratiques pour le traitement des exceptions. Chaque fois qu'une exception se produit, j'ouvre une boîte de dialogue d'exception affichant les informations nécessaires, c'est-à-dire le message et la pile. La confusion majeure que j'ai est dans les cas où je veux que l'utilisateur voit seulement un message amical mais en même temps s'assure que le développeur obtiendrait les données nécessaires pour le débogage. Quelle est la meilleure façon de procéder?Gestion des exceptions et messages conviviaux

Répondre

2

Je ne l'ai pas utilisé personnellement, mais Red Gate's Exception Hunter ressemble à un outil assez cool. Votre meilleur pari pourrait consister à enregistrer l'erreur sur le disque afin qu'il soit disponible au cas où quelqu'un aurait besoin de le regarder, mais ne pas apparaître dans le chemin de vos utilisateurs. Si vous le souhaitez, vous pouvez ouvrir une fenêtre demandant à l'utilisateur de soumettre les informations sur les exceptions et de vous envoyer une trace via votre site Web (en cliquant simplement sur OK). Évitez d'envoyer des informations privées, ce qui signifie probablement ne pas envoyer de valeurs de paramètres.

Editer: Oh, évitez de dire "Exception et trace de pile". Dites "Une erreur est survenue, mais avec votre aide nous pouvons la réparer plus rapidement. Voulez-vous envoyer automatiquement les informations d'erreur à ____ pour le moment?" Veuillez noter qu'aucune information personnelle ne sera transmise avec le rapport d'erreurs. Détails 'pour montrer l'information complète du rapport. " Si elles cliquent sur les détails, développez verticalement la fenêtre pour afficher une zone de texte en lecture seule avec les données.

0
catch (Exception ex) 
{ 
    cApp.DB.LogException(ex); 
    Messagebox.Show(...); 
} 

Les journaux cApp.DB.LogException(ex) à une table de base de données, à moins que la base de données est en baisse alors il ajoute dans un fichier texte.

0

J'ai une méthode utilitaire que j'utilise dans les programmes utilitaires que j'écris dans WinForms. Avec un peu de soin, il pourrait être utile dans la production des applications WinForms (laisser les experts ne ménagent leurs critiques):

surcharges de proximité:

private void PerformUIAction(Action action) 
{ 
    PerformUIAction(action, (string) null); 
} 

private void PerformUIAction(Action action, string message) 
{ 
    PerformUIAction(action,() => message); 
} 

Le vrai:

private void PerformUIAction(Action action, Func<string> messageHandler) 
{ 
    var saveCursor = Cursor; 
    Cursor = Cursors.WaitCursor; 
    try 
    { 
     action(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(
      messageHandler() ?? ex.Message, 
      "Exception!", 
      MessageBoxButtons.OK, 
      MessageBoxIcon.Error, 
      MessageBoxDefaultButton.Button1, 
      MessageBoxOptions.DefaultDesktopOnly); 
     // Replace with logging code. The important part is ex.ToString(), 
     // not ex.Message 
     Debug.WriteLine(ex.ToString(), "Exception"); 
     throw; 
    } 
    finally 
    { 
     Cursor = saveCursor; 
    } 
} 

Exemple de utiliser:

private void _samplesMenu_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    PerformUIAction(
     delegate 
      { 
       // Do the real work of the event in here. 
       // You can reference sender and e 
      }, 
     delegate 
      { 
       return string.Format(
        "Error while processing action {1} for node {0}", 
        e.Node.FullPath, e.Action); 
      }); 
} 
+0

comment est-ce différent de simple essayer attraper? Vous changez la construction d'une langue à l'autre pour avoir le même effet. – nawfal

+0

Il affiche le curseur "Attendre", exécute l'action, affiche n'importe quelle exception dans un MessageBox. –

+0

hmm oui je l'ai alors négligé, en l'implémentant déjà dans ma solution: P – nawfal

0

Merci pour vos réponses ... Je suppose que le dumping de la pile dans certains fichier journal et montrant l'utilisateur seulement message amical fonctionnerait dans mon cas :)