2010-11-24 4 views
0

J'ai trouvé quelques question sur le filtrage des exceptions en C#. Et je pense écrire une émulation pour ça. Je ne sais pas comment cela aide pour quelqu'un et je n'ai pas travaillé avec le filtrage VB. Bien sûr, il n'est pas optimisé et la production est prête, mais fonctionne et fait ce qu'il faut faire (comment j'ai compris le problème). Sketch de travail donc:Moniteur d'exception C# avec filtrage

using System; 


namespace ExceptionFiltering 
{ 
    class ExceptionMonitor 
    { 
     Action m_action = null; 

     public ExceptionMonitor(Action action) 
     { 
      this.m_action = action; 
     } 

     public void TryWhere(Func<Exception, bool> filter) 
     { 
      try 
      { 
       this.m_action(); 
      } 
      catch (Exception ex) 
      { 
       if (filter(ex) == false) 
       { 
        throw; 
       } 
      } 
     } 

     public static void TryWhere(Action action, Func<Exception, bool> filter) 
     { 
      try 
      { 
       action(); 
      } 
      catch (Exception ex) 
      { 
       if (filter(ex) == false) 
       { 
        throw; 
       } 
      } 
     } 
    } 

    class Program 
    { 
     //Simple filter template1 
     static Func<Exception, bool> m_defaultExceptionFilter = ex => 
     { 
      if (ex.GetType() == typeof(System.Exception)) 
      { 
       return true; 
      } 

      return false; 
     }; 

     //Simple filter template2 
     static Func<Exception, bool> m_notImplementedExceptionFilter = ex => 
     { 
      if (ex.GetType() == typeof(System.NotImplementedException)) 
      { 
       return true; 
      } 

      return false; 
     }; 


     static void Main(string[] args) 
     { 
      //Create exception monitor 
      ExceptionMonitor exMonitor = new ExceptionMonitor(() => 
      { 
       //Body of try catch block 
       throw new Exception(); 
      }); 

      //Call try catch body 
      exMonitor.TryWhere(m_defaultExceptionFilter); 


      //Call try catch body using static method 
      ExceptionMonitor.TryWhere(() => 
      { 
       //Body of try catch block 
       throw new System.NotImplementedException(); 

      }, m_notImplementedExceptionFilter); 


      //Can be syntax like ExceptionMonitor.Try(action).Where(filter) 

      //Can be made with array of filters 
     } 
    } 
} 

À propos de: gestionnaire d'exception global, prenant en charge plusieurs filtres, etc;

Merci pour tous conseils, corrections et optimisations !!!

+2

Quelle est votre question? – cdhowie

+1

@cdhowie: Je pense que la question est «quel est votre conseil?' –

+0

@cdhowie je pense que ma question est de savoir comment j'ai compris le problème de filtrage d'exception))) – Edward83

Répondre

2

Désolé je suis nouveau à C# donc je ne peux pas comprendre votre code, mais encore j'espère que mon conseil peut aider.

if (somecondition) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

peut être simplement:

return somecondition; 

Et vous devez vérifier null avant invoquer une Action:

if (m_action!=null) m_action(); 
+0

+1 pour signaler les erreurs valides dans l'exemple de code. –

+1

@ Edward83 - Il est à noter que l'action m_action par défaut est nulle alors l'assigner à null est un peu inutile. C'est la seule chose qui me dérange que les programmeurs définissent des variables booléennes à false, et des variables entières à zéro, parce qu'ils sont utilisés dans des langages comme C++ –