Sdílet prostřednictvím


CA2200: Znovu vyvolejte pro zachování podrobností zásobníku

TypeName

RethrowToPreserveStackDetails

CheckId

CA2200

Kategorie

Microsoft.Usage

Narušující změna

Nenarušující

Příčina

Výjimka je znovu vyvolána a je jednoznačně uvedena v příkazu throw.

Popis pravidla

Jakmile je vyvolána výjimka, část informací, které nese je trasování zásobníku.Trasování zásobníku je seznam hierarchie volání metod, který začíná metodou, který vyvolala výjimku a končí metodou, který výjimku zachytila.Pokud je výjimku vyvolána znovu určením výjimky v příkazu throw, je zásobník trasování restartován na dané metodě a seznam volání metod mezi původní metodou, která vyvolala výjimku a aktuální metodou je ztracen.Pro zachování původní informace trasování zásobníku s výjimkou, použijte příkaz throw bez určení výjimky.

Jak vyřešit porušení

Pro vyřešení porušení tohoto pravidla znovu vyvolejte výjimku bez výslovného určení výjimky.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad

Následující příklad ukazuje způsob, CatchAndRethrowExplicitly, který porušuje pravidlo a metodu, CatchAndRethrowImplicitly, která splňuje pravidlo.

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