Udostępnij za pośrednictwem


CA2200: Należy zgłosić ponownie, aby zachować szczegóły 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");
      }
   }
}