CA2200 : Levez à nouveau une exception pour conserver les détails de la pileCA2200: Rethrow to preserve stack details

TypeNameTypeName RethrowToPreserveStackDetailsRethrowToPreserveStackDetails
CheckIdCheckId CA2200CA2200
CategoryCategory Microsoft.UsageMicrosoft.Usage
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Une exception est à nouveau levée et est spécifiée explicitement dans la throw instruction.An exception is re-thrown and the exception is explicitly specified in the throw statement.

Description de la règleRule Description

Une fois qu’une exception est levée, partie des informations qu’il transporte est la trace de pile.Once an exception is thrown, part of the information it carries is the stack trace. La trace de pile est une liste de la hiérarchie d’appels de méthode qui commence par la méthode qui lève l’exception et se termine par la méthode qui intercepte l’exception.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 une exception est levée à nouveau en spécifiant l’exception dans le throw instruction, la trace de pile est redémarrée à la méthode actuelle et la liste d’appels de méthode entre la méthode d’origine qui a levé l’exception et la méthode actuelle est perdue.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. Pour conserver les informations de trace de pile d’origine avec l’exception, utilisez la throw instruction sans spécifier l’exception.To keep the original stack trace information with the exception, use the throw statement without specifying the exception.

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, lever à nouveau l’exception sans la spécification explicite de l’exception.To fix a violation of this rule, re-throw the exception without specifying the exception explicitly.

Quand supprimer les avertissementsWhen to Suppress Warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule.

ExempleExample

L’exemple suivant montre une méthode, CatchAndRethrowExplicitly, ce qui enfreint la règle et une méthode, CatchAndRethrowImplicitly, qui satisfait la règle.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