2010-10-30 8 views
3

J'ai un contrôle utilisateur, qui contient plusieurs méthodes et chacune de ces méthodes a un bloc try-catch. Je n'attrape qu'un seul type d'exceptions, par exemple ArgumentException. Mise à jour - Je n'attrape pas une exception mais plusieurs exceptions que j'ai définies.Comment attraper toutes les exceptions dans un contrôle utilisateur

Chacune de ces méthodes gère l'ArgumentException de la même manière, j'ai donc du code redondant. Est-ce que je peux attraper ArgumentException dans un endroit de sorte que toutes les méthodes dans le contrôle d'utilisateur l'emploieraient?

Mise à jour 1: L'application est utilisée dans la production et elle est utilisée par de nombreuses personnes qui ne sont pas très familières avec les ordinateurs. Simplifié - ils doivent insérer beaucoup de nombres dans la base de données (avec l'aide d'un scanner optique portatif) et bien sûr ils font des erreurs. Il y a au moins 8 exceptions courantes (mauvaise taille, mauvais type, ...) et dans ma logique métier, j'attrape toutes ces exceptions et les envoie à l'interface graphique. Parce que l'environnement, où l'application est installée, est très moche, je joue un son d'erreur fort et affiche le message d'erreur. En raison de la logique métier, ils ont plusieurs options pour insérer ces numéros, de sorte que la même logique de détection d'erreur se trouve dans plusieurs méthodes à travers le contrôle utilisateur.

Update2: en fait je ne suis pas attraper ArgumentException mais mes propres exceptions, par exemple CodeFormatException, CodeDoesntExistException, CodeNotInTheSelectedRollException etc.

+1

Ceci est la gestion des exceptions Pokémon. Vous ne pouvez pas gérer une ArgumentException, c'est un bug de programmation. Votre gestionnaire de catch ne peut pas réécrire le code source pour corriger le bug. –

+0

Je ne suis pas sûr de comprendre votre réponse. J'ai mis à jour ma question pour mieux décrire mon problème. – sventevit

+0

@Hans Passant: je suis entièrement d'accord avec vous. – Svisstack

Répondre

2

Vous pouvez obtenir ce morceau de code dans une fonction d'arguments de validation et de l'appeler au début de votre fonction.

1

Si vous avez des droits de code non managé, vous pourriez remplacer la méthode WndProc de votre UserControl (si vous ne disposez pas des droits de code non managé, l'application lancera une exception dès que votre classe UserControl est d'abord référencé). Les événements clavier, souris et peinture sont provoqués par les messages traités dans WndProc. Appelez donc l'implémentation de base de cette méthode dans try ... catch pour gérer ces événements. Pour les autres, vous devrez les emballer chacun dans un essai ... attraper, mais vous pouvez déplacer votre logique de capture vers une méthode d'assistance appelée à partir de tous les blocs catch afin de ne pas dupliquer le code.

Éditer: En fait, je pense que quelque chose comme ça pourrait être mieux. Il ne nécessite pas d'autorisations et vous pouvez l'utiliser pour des événements tirés d'autres contrôles sur votre UserControl ainsi:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.Load += new TryCatchHandler(new EventHandler(this.Form1_Load)).EventHandler; 
     this.MouseClick += new TryCatchHandler(new MouseEventHandler(this.Form1_MouseClick)).EventHandler; 

     this.button1.Click += new TryCatchHandler(new EventHandler(this.button1_Click)).EventHandler; 
    } 

    private void Form1_MouseClick(object sender, MouseEventArgs e) 
    { 
     // ... 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     // ... 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // ... 
    } 

    private class TryCatchHandler 
    { 
     public Delegate handler; 

     public TryCatchHandler(Delegate handler) 
     { 
      this.handler = handler; 
     } 

     public void EventHandler(object sender, EventArgs e) 
     { 
      try 
      { 
       this.handler.Method.Invoke(this.handler.Target, new object[] { sender, e }); 
      } 
      catch (ArgumentException exc) 
      { 
       // ... 
      } 
     } 
    } 
} 
0

Derive vos exceptions d'une classe de base, factoriser puis votre code de gestion des exceptions à une méthode qui accepte la classe d'exception de base en tant que paramètre. Ensuite, vous pouvez gérer l'exception et la propoguer si nécessaire.

Questions connexes