2010-11-11 66 views
1

C'est une question idiote que j'admets. Donc, excuses si cela vous fait perdre votre temps, mais je ne peux pas trouver une solution.Quitter l'application en cas d'erreur dans une bibliothèque C#

Une application WinForm qui a une bibliothèque de classes. J'utilise Log4Net dll pour la journalisation des informations.

Sur Button_Click, j'appelle une fonction dans la bibliothèque de classes qui pourrait lancer une erreur. Donc, j'ai le contenu de la fonction dans un bloc try-catch-finally. Dans la capture, j'écris des déclarations de journal (en utilisant Log4Net dll).

Maintenant, qu'une erreur s'est produite, je veux qu'un message soit montré à l'interface utilisateur. Et après qu'un message soit affiché, je veux qu'il quitte.

Comment puis-je transmettre le contrôle du bloc catch de la bibliothèque de classes au code de formulaire pour afficher un message, puis quitter?

Répondre

5

Il suffit d'appeler throw sans aucun paramètre après avoir identifié l'erreur dans le gestionnaire d'exception dans la bibliothèque de classe et il va réémettre exactement la même exception avec le même callstack etc.

Ensuite, laissez vos prises de forme, il et le gérer comme vous voulez.

2

Dans la méthode de la bibliothèque de classes, dans la capture, renvoyez l'exception, afin qu'elle puisse remonter jusqu'au formulaire.

Dans la forme Button_Click enveloppez l'appel de la méthode de classe dans un catch try, et dans le catch afficher le message et quitter.

0

La bibliothèque devrait probablement relancer l'exception après la connexion à ce sujet.

class Form 
{ 
    OnClick() 
    { 
     try 
     { 
      library.Routine(); 
     } 
     catch(Exception e) 
     { 
      // messagebox 
      // exit 
     } 
    } 
} 

class Library 
{ 
    public void Routine() 
    { 
     try 
     { 
      // stuff 
     } 
     catch(Exception e) 
     { 
      logger.error("error in routine", e); 
      throw; 
     } 
    } 
} 
+0

Merci! Supposons que je l'ai deux niveaux profonds. Le formulaire appelle une ClassLibrary1, qui appelle ClassLibrary2. Si je devais enregistrer l'erreur dans ClassLibrary2, alors dans ClassLibrary1, je ne peux que lancer et ne pas faire de journalisation dans le bloc Catch de ClassLibrary1. – Magic

+0

@Magic. Je pense que cela fonctionnera, et c'est vraiment à vous de décider. La plupart de mes projets se connectent à plusieurs niveaux. J'essaie de l'organiser raisonnablement bien dans la plupart des endroits, de sorte que la plupart du temps mes exceptions ne sont enregistrées qu'une seule fois. Dans de nombreux cas, cependant, je préfère risquer une petite journalisation redondante pour ne pas avoir de journalisation du tout, donc je finis parfois par enregistrer une exception deux fois ou même parfois trois fois. Comme je l'ai dit, j'essaie de l'éviter, mais cela dépend vraiment de qui utilise les bibliothèques et de quoi. –