Cómo detectar una mala manera de volver a lanzar una excepción usando C # StyleCop o VS2010?
Pregunta
Mis colegas se sazonan los piratas informáticos C ++ conmutación a .Net. Uno de los errores que se hacen sin intención es escribir código como este:
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.
}
he visto este hecho en muchos lugares. Realmente no puedo pensar en una situación en la que el corte de la traza de la pila sería útil. Creo que debe haber situación excepcional que merece un comentario. Corrígeme si estoy equivocado. Si el seguimiento de la pila se va a cortar, creo que es siempre mejor que hacer:
throw new ArgumentException("text", ae /* inner exc */);
En cualquier caso, lo que quiero hacer es detectar todos los casos y dar una advertencia . Una búsqueda de expresiones regulares es de ninguna ayuda, debido a esto:
catch(Exception e)
{
Exception newExc = new Exception("text", e);
Log(newExc);
throw newExc;
}
I tendría que utilizar una herramienta como StyleCop (que tengo, versión 4.3.3.0). Estoy utilizando VS2008 por ahora, pero será el cambio a VS2010 muy pronto.
¿Alguna idea sobre cómo llevar a cabo lo que estoy buscando?
Solución
FxCop tiene una regla para esto: RethrowToPreserveStackDetails
Una vez que se produce una excepción, parte de la información que transmite es la seguimiento de la pila. El seguimiento de la pila es una lista de la jerarquía de llamada a un método que comienza con el método que lanza el excepción y termina con el método que las capturas de la excepción. Si una excepción se re-lanzado especificando la excepción en la sentencia throw, el seguimiento de la pila se reinicia en el método actual y la lista de método las llamadas entre el método original que lanzó la excepción y la corriente método se pierde. Para mantener el original información de seguimiento de la pila con el excepción, utilizar la instrucción throw sin especificar la excepción.
Creo Análisis FxCop está integrado en VS2010, pero no estoy 100% seguro ...
Esta es la href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9aeaa970-f281-4fb0-aba1-d59d7ed09772&displaylang=en" rel="noreferrer"> Microsoft enlace de descarga .
Otros consejos
es el código de captura de excepciones innecesariamente? Si sólo está interesado en el registro de la excepción, entonces sólo se necesita una captura en el nivel superior de su código (en el último punto posible donde se puede hacer el registro). Esto podría reducir considerablemente el número de capturas que tiene que preocuparse.
Yo sugeriría que buscar captura-bloques que terminan en un tiro ...; en vez de terminar con un tiro;.
A pesar de que usted consigue un poco falso positivo, puede filtrarlos a mano.