CA2200: relançar para preservar detalhes da pilha
TypeName |
RethrowToPreserveStackDetails |
CheckId |
CA2200 |
Categoria |
Microsoft.Usage |
Alteração Significativa |
Sem Quebra |
Causa
Uma exceção é lançada novamente e a exceção é especificada explicitamente na declaração throw.
Descrição da Regra
Uma vez que uma exceção é gerada, a parte das informações que ela contém está no rastreamento de pilha.O rastreamento de pilha é uma lista da hierarquia de chamada de método que começa com o método que gera a exceção e termina com o método que captura a exceção.Se uma exceção for gerada novamente pela especificação da exceção na declaração throw, o rastreamento de pilha será reiniciado no método atual e a lista de chamadas de métodos entre o método original que apresentou a exceção e o método atual será perdida.Para manter as informações originais do rastreamento de pilha com a exceção, use a declaração throw sem especificar a exceção.
Como Corrigir Violações
Para corrigir uma violação desta regra, gere novamente a exceção sem especificar a exceção explicitamente.
Quando Suprimir Alertas
Não elimine um alerta desta regra.
Exemplo
O exemplo a seguir mostra um método, CatchAndRethrowExplicitly, que viola a regra e um método, CatchAndRethrowImplicitly, que satisfaz a regra.
Imports System
Namespace UsageLibrary
Class TestsRethrow
Shared Sub Main()
Dim testRethrow As New TestsRethrow()
testRethrow.CatchException()
End Sub
Sub CatchException()
Try
CatchAndRethrowExplicitly()
Catch e As ArithmeticException
Console.WriteLine("Explicitly specified:{0}{1}", _
Environment.NewLine, e.StackTrace)
End Try
Try
CatchAndRethrowImplicitly()
Catch e As ArithmeticException
Console.WriteLine("{0}Implicitly specified:{0}{1}", _
Environment.NewLine, e.StackTrace)
End Try
End Sub
Sub CatchAndRethrowExplicitly()
Try
ThrowException()
Catch e As ArithmeticException
' Violates the rule.
Throw e
End Try
End Sub
Sub CatchAndRethrowImplicitly()
Try
ThrowException()
Catch e As ArithmeticException
' Satisfies the rule.
Throw
End Try
End Sub
Sub ThrowException()
Throw New ArithmeticException("illegal expression")
End Sub
End Class
End Namespace
using System;
namespace UsageLibrary
{
class TestsRethrow
{
static void Main()
{
TestsRethrow testRethrow = new TestsRethrow();
testRethrow.CatchException();
}
void CatchException()
{
try
{
CatchAndRethrowExplicitly();
}
catch(ArithmeticException e)
{
Console.WriteLine("Explicitly specified:{0}{1}",
Environment.NewLine, e.StackTrace);
}
try
{
CatchAndRethrowImplicitly();
}
catch(ArithmeticException e)
{
Console.WriteLine("{0}Implicitly specified:{0}{1}",
Environment.NewLine, e.StackTrace);
}
}
void CatchAndRethrowExplicitly()
{
try
{
ThrowException();
}
catch(ArithmeticException e)
{
// Violates the rule.
throw e;
}
}
void CatchAndRethrowImplicitly()
{
try
{
ThrowException();
}
catch(ArithmeticException e)
{
// Satisfies the rule.
throw;
}
}
void ThrowException()
{
throw new ArithmeticException("illegal expression");
}
}
}