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