2010-11-11 11 views
2

Est-ce qu'il se demandait comment chercher un bloc try/catch qui n'a pas de log.Error (ex) dans son bloc catch. Par recherche, je veux dire en utilisant Visual Studio construit dans la recherche regex.Recherche d'un bloc try/catch spécifique en utilisant RegEx

Regex trouverait bloc comme ceci:

try 
{ 
    CallSomeExceptionalFunction(); 
} 
catch(Exception ex) 
{ 
    CallSomething(); 
    // missing error handling 
} 

Ce bloc doit être ignoré par regex car il contient log.Error:

try 
{ 
    CallSomeExceptionalFunction(); 
} 
catch(Exception ex) 
{ 
    log.Error(ex); 
} 
+1

Vous voulez dire que vous voulez utiliser la recherche regex intégrée de Visual Studio? Ou voulez-vous le faire dans un programme C# qui analyse le code source? Aussi, peut-il y avoir plus d'une paire d'accolades après un bloc 'try' ou' catch'? Si oui, vous ne pouvez pas le faire avec une regex. –

+0

Ne soyez pas si paresseux :) –

+0

Comme déjà dit, si vous avez des blocs catch arbitraires, les expressions régulières ne peuvent pas vraiment vous aider. Si tous vos blocs catch sont exactement comme dans votre exemple, cela peut être fait. Mais mon pari est que vous passerez moins de temps et d'efforts en cherchant simplement tout votre code pour la phrase «attraper» et ensuite vérifier manuellement si vous utilisez votre enregistreur préféré. – Mikael

Répondre

4

Vous ne pouvez pas analyser les langages de programmation basée sur un hors-contexte grammaire avec une expression régulière. Imaginez qu'il y avait un bloc try-catch à l'intérieur de votre bloc catch, et un autre bloc try-catch dans son bloc catch, et seul l'un d'entre eux a l'erreur log.Error.

1

En supposant que vous voulez faire dans le code, je ne vous inquiéter Regex, je venais chercher le mot catch, puis compter le nombre d'accolades à partir après que { et en soustrayant toute fin accolades } de cette compte, l'arrêt lorsque j'ai trouvé une ligne contenant log.Error et si la ligne n'est pas trouvée avant que le compte atteint zéro, alors vous avez une instance où le journal est manquant.

+0

Mais cela nécessiterait l'écriture d'un outil de recherche personnalisé? Je ne peux pas être fait dans la recherche intégrée de Visual Studio? –

+0

@Ivan: J'ai mal compris, je pensais que c'était ce que tu faisais depuis que tu avais 'C#' comme balise. Cependant, je pensais que vous pouviez écrire une macro VS pour le faire autrement (ou un addon VS si vous voulez être avancé) et ainsi vous l'auriez toujours dans VS. –