Como detectar uma maneira ruim de refazer uma exceção C# usando Stylecop ou VS2010?
Pergunta
Meus colegas são os hackers C ++ experientes que mudam para .NET. Um dos erros que eles cometem involuntariamente é escrever 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.
}
Eu já vi isso feito em muitos lugares. Não consigo pensar em uma situação em que o corte do rastreamento da pilha seria útil. Eu acho que essa deve ser uma situação excepcional que merece um comentário. Me corrija se eu estiver errado. Se o rastreamento da pilha for cortado, acho que é sempre melhor fazer:
throw new ArgumentException("text", ae /* inner exc */);
De qualquer forma, o que eu quero fazer é detectar todos esses casos e Dê um aviso. Uma pesquisa de expressão regular não ajuda, por causa disso:
catch(Exception e)
{
Exception newExc = new Exception("text", e);
Log(newExc);
throw newExc;
}
Eu teria que usar uma ferramenta como o Stylecop (que eu tenho, versão 4.3.3.0). Estou usando o VS2008 por enquanto, mas vou mudar para o VS2010 muito em breve.
Alguma idéia de como realizar o que estou procurando?
Solução
O FXCOP tem uma regra para isso: RETHROWTOPERSERVEstackDetails
Uma vez que uma exceção é lançada, parte das informações que ele carrega é o rastreamento da pilha. O rastreamento da pilha é uma lista da hierarquia de chamadas de método que começa com o método que lança a exceção e termina com o método que captura a exceção. Se uma exceção for re-arruinada especificando a exceção na declaração de arremesso, o rastreamento da pilha será reiniciado no método atual e a lista de chamadas de método entre o método original que lançou a exceção e o método atual será perdido. Para manter as informações originais do Stack Trace com a exceção, use a instrução THON sem especificar a exceção.
Eu acredito que a análise do FXCOP foi incorporada ao VS2010, mas não tenho 100% de certeza ...
Aqui está o Link para download da Microsoft para FXCOP.
Outras dicas
O código captura exceções é desnecessariamente? Se você estiver interessado apenas em registrar a exceção, só precisará de uma captura no nível superior do seu código (no último ponto possível em que você pode fazer o log). Isso pode reduzir seriamente o número de capturas com as quais você precisa se preocupar.
Eu sugeriria procurar blocos de captura terminando em um arremesso ...; Em vez de terminar com arremesso;.
Embora você tenha algum falso positivo, pode filtrá -los à mão.