CA2200: スタック詳細を保持するために再度スローします

TypeName

RethrowToPreserveStackDetails

CheckId

CA2200

カテゴリ

Microsoft.Usage

互換性に影響する変更点

なし

原因

例外が再スローされ、throw ステートメントで例外が明示的に指定されます。

規則の説明

例外がスローされると、例外で伝達される情報の一部は、スタック トレースになります。 スタック トレースは、メソッドの呼び出し階層構造の一覧です。この一覧は、例外をスローするメソッドで始まり、例外をキャッチするメソッドで終了します。 throw ステートメントで例外を指定して例外が再スローされると、スタック トレースは現在のメソッドで再開され、例外をスローした元のメソッドと現在のメソッドの間で呼び出されたメソッドの一覧は失われます。 例外と共に元のスタック トレース情報を保存するには、例外を指定しないで throw ステートメントを使用します。

違反の修正方法

この規則違反を修正するには、例外を明示的に指定せずに、例外を再スローします。

警告を抑制する状況

この規則による警告は抑制しないでください。

使用例

この規則に違反しているメソッド CatchAndRethrowExplicitly と、規則に適合するメソッド CatchAndRethrowImplicitly を次の例に示します。

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