CA2200: Iniciar de nuevo para preservar los detalles de la pilaCA2200: Rethrow to preserve stack details

TypeNameTypeName RethrowToPreserveStackDetailsRethrowToPreserveStackDetails
Identificador de comprobaciónCheckId CA2200CA2200
CategoríaCategory Microsoft.UsageMicrosoft.Usage
Cambio problemáticoBreaking Change No trascendentalNon Breaking

MotivoCause

Se vuelve a producir una excepción y la excepción se especifica explícitamente en el throw instrucción.An exception is rethrown and the exception is explicitly specified in the throw statement.

Descripción de la reglaRule description

Una vez que se produce una excepción, parte de la información que lleva es el seguimiento de pila.Once an exception is thrown, part of the information it carries is the stack trace. El seguimiento de pila es una lista de la jerarquía de llamadas de método que empieza por el método que produce la excepción y termina con el método que detecta la excepción.The stack trace is a list of the method call hierarchy that starts with the method that throws the exception and ends with the method that catches the exception. Si se produce una excepción de nuevo mediante la especificación de la excepción en el throw instrucción, se reinicia el seguimiento de pila en el método actual y la lista de llamadas de método entre el método original que produjo la excepción y el método actual se pierde.If an exception is re-thrown by specifying the exception in the throw statement, the stack trace is restarted at the current method and the list of method calls between the original method that threw the exception and the current method is lost. Para mantener la información de seguimiento de pila original con la excepción, utilice el throw instrucción sin especificar la excepción.To keep the original stack trace information with the exception, use the throw statement without specifying the exception.

Cómo corregir infraccionesHow to fix violations

Para corregir una infracción de esta regla, vuelva a producir la excepción sin especificar explícitamente la excepción.To fix a violation of this rule, rethrow the exception without specifying the exception explicitly.

Cuándo Suprimir advertenciasWhen to suppress warnings

No suprima las advertencias de esta regla.Do not suppress a warning from this rule.

EjemploExample

El ejemplo siguiente muestra un método, CatchAndRethrowExplicitly, lo que infringe la regla y un método, CatchAndRethrowImplicitly, que cumple la regla.The following example shows a method, CatchAndRethrowExplicitly, which violates the rule and a method, CatchAndRethrowImplicitly, which satisfies the rule.

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