Como detectar uma maneira ruim de refazer uma exceção C# usando Stylecop ou VS2010?

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

  •  26-09-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top