Comment détecter une mauvaise façon de re-jeter un C # Exception en utilisant StyleCop ou VS2010?

StackOverflow https://stackoverflow.com/questions/2835506

  •  26-09-2019
  •  | 
  •  

Question

Mes collègues sont assaisonnés des pirates de passer à .Net C. L'une des erreurs qu'ils font le code est involontairement écrit comme ceci:

catch(ArgumentExcepttion ae)
{
    // Code here logs the exception message
    // And this is supposed to re-throw the exeception
    throw ae; // as opposed to throw;
    // But, as we all know, doing this creates a new exception with a shorter stack trace.
}

J'ai vu cela dans beaucoup d'endroits. Je ne peux pas vraiment penser à une situation où couper la trace de la pile serait utile. Je pense que cela devrait être situation exceptionnelle qui mérite un commentaire. Corrigez-moi si je me trompe. Si la trace de la pile doit être coupée, je pense qu'il est toujours préférable de faire:

throw new ArgumentException("text", ae /* inner exc */);

De toute façon, ce que je veux faire est de détecter tous les cas et donner un avertissement . Une recherche d'expression régulière est d'aucune aide, à cause de cela:

catch(Exception e)
{
    Exception newExc = new Exception("text", e);
    Log(newExc);
    throw newExc;
}

Je dois utiliser un outil tel que StyleCop (que j'ai, la version 4.3.3.0). J'utilise VS2008 pour l'instant, mais sera de passer à VS2010 très bientôt.

Toute réflexion sur la façon d'accomplir ce que je cherche?

Était-ce utile?

La solution

FxCop a une règle pour cela: RethrowToPreserveStackDetails

  

Une fois qu'une exception est levée, une partie de   l'information qu'il transporte est le   trace de la pile. La trace de pile est une liste   de la hiérarchie d'appel de méthode qui   commence par la méthode qui lève la   exception et se termine par le procédé   qui attire l'exception. Si un   exception est relancées en spécifiant   l'exception dans l'instruction throw,   la trace de la pile est redémarré à la   méthode actuelle et la liste de procédé   les appels entre la méthode originale   l'exception et a jeté le courant   méthode est perdue. Pour conserver l'original   les informations de trace pile avec le   exception, utilisez l'instruction throw   sans préciser l'exception.

Je crois que FxCop analyse est construit pour VS2010 mais je ne suis pas 100% sûr ...

Voici le lien de téléchargement de Microsoft FxCop.

Autres conseils

Le code est attrapant inutilement des exceptions? Si vous ne souhaitez que connecter l'exception, alors vous avez seulement besoin d'une prise au niveau du haut de votre code (au dernier point possible où vous pouvez faire l'enregistrement). Cela pourrait réduire considérablement le nombre de prises que vous avez à vous soucier.

Je suggère de chercher des prises blocs se terminant par un jet ...; au lieu de finir avec un jet;.

Bien que vous obtenez des faux positifs, vous pouvez les filtrer à la main.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top