Compartilhar via


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");
      }
   }
}