Cómo detectar una mala manera de volver a lanzar una excepción usando C # StyleCop o VS2010?

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

  •  26-09-2019
  •  | 
  •  

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?

¿Fue útil?

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.

scroll top