Udostępnij za pośrednictwem


CA2200: Ponownego zgłoszenia do zachowania szczegółów stosu

TypeName

RethrowToPreserveStackDetails

CheckId

CA2200

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Wyjątek jest zgłaszany ponownie i wyjątek jest jawnie określony w instrukcji throw.

Opis reguły

Gdy wyjątek zostaje zgłoszony częścią informacji, które niesie jest ślad stosu.Ślad stosu jest listą hierarchii wywołań metody, która rozpoczyna się na metodzie, która zgłasza wyjątek, a kończy się na metodzie, która przechwytuje wyjątek.Jeśli wyjątek jest zgłaszany ponownie przez określenie wyjątku w instrukcji throw, ślad stosu jest uruchamiany ponownie dla bieżącej metody, a lista wywołań metod między pierwotną metodą, która zgłosiła wyjątek, a bieżącą metodą zostanie utracona.Aby zachować pierwotne informacje śladu stosu z wyjątkiem, użyj instrukcji throw bez określania wyjątku.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, ponowne zgłoś wyjątek bez jawnego określania wyjątku.

Kiedy pomijać ostrzeżenia

Nie należy pomijać ostrzeżenia dotyczącego tej reguły.

Przykład

Poniższy przykład ilustruje metodę CatchAndRethrowExplicitly, który narusza regułę i metodę, CatchAndRethrowImplicitly, która spełnia regułę.

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