Freigeben über


CA2200: Erneut ausführen, um Stapeldetails beizubehalten

TypeName

RethrowToPreserveStackDetails

CheckId

CA2200

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Eine Ausnahme wird erneut ausgelöst, und die Ausnahme wird in der throw-Anweisung explizit angegeben.

Regelbeschreibung

Sobald eine Ausnahme ausgelöst wird, ist die Stapelüberwachung ein Teil der übertragenen Informationen. Die Stapelüberwachung ist eine Liste der Methodenaufrufhierarchie. Sie beginnt mit der Methode, durch die die Ausnahme ausgelöst wird, und endet mit der Methode, durch die die Ausnahme abgefangen wird. Wenn eine Ausnahme erneut ausgelöst wird, indem die Ausnahme in der throw-Anweisung angegeben wird, wird die Stapelüberwachung bei der aktuellen Methode neu gestartet. Die Liste der aufgerufenen Methoden zwischen der ursprünglichen Methode, durch die die Ausnahme ausgelöst wird, und der aktuellen Methode geht dabei verloren. Wenn die ursprünglichen Stapelinformationen mit der Ausnahme gespeichert werden sollen, verwenden Sie die throw-Anweisung ohne Angabe der Ausnahme.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, lösen Sie die Ausnahme erneut aus, ohne die Ausnahme explizit anzugeben.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

Im folgenden Beispiel wird die CatchAndRethrowExplicitly-Methode gezeigt, die gegen die Regel und eine Methode verstößt. Außerdem wird die CatchAndRethrowImplicitly-Methode gezeigt, die der Regel entspricht.

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