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