CA2200: Należy zgłosić ponownie, aby zachować szczegóły stosu
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2200 |
Tytuł | Ponowie zgłoś wyjątek, aby zachować szczegóły stosu |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako ostrzeżenie |
Przyczyna
Wyjątek jest ponownie wprowadzany, a wyjątek jest jawnie określony w instrukcji throw
.
Opis reguły
Po wyrzuceniu wyjątku część informacji, które prowadzi, to ślad stosu. Ślad stosu to lista hierarchii wywołań metody rozpoczynająca się od metody, która zgłasza wyjątek i kończy się metodą, która przechwytuje wyjątek. Jeśli wyjątek zostanie ponownie zgłoszony przez określenie wyjątku throw
w instrukcji, ślad stosu zostanie uruchomiony ponownie w bieżącej metodzie i lista wywołań metod między oryginalną metodą, która zwróciła wyjątek i bieżącą metodę zostanie utracona. Aby zachować oryginalne informacje śledzenia stosu z wyjątkiem, użyj throw
instrukcji bez określania wyjątku.
Jeśli ponownie wywrócisz wyjątek z innego miejsca niż program obsługi (catch
blok), użyj polecenia ExceptionDispatchInfo.Capture(Exception) , aby przechwycić wyjątek w procedurze obsługi i ExceptionDispatchInfo.Throw() kiedy chcesz go ponownie wywrócić.
Aby uzyskać więcej informacji, zobacz Przechwyć i ponownie wzrosić wyjątki prawidłowo.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, wróć wyjątek bez jawnego określenia wyjątku.
Kiedy pomijać ostrzeżenia
Nie pomijaj ostrzeżeń dla tej reguły.
Przykład
W poniższym przykładzie przedstawiono metodę , CatchAndRethrowExplicitly
która narusza regułę i metodę , CatchAndRethrowImplicitly
która spełnia regułę.
class TestsRethrow
{
static void Main2200()
{
TestsRethrow testRethrow = new TestsRethrow();
testRethrow.CatchException();
}
void CatchException()
{
try
{
CatchAndRethrowExplicitly();
}
catch (ArithmeticException e)
{
Console.WriteLine($"Explicitly specified:{Environment.NewLine}{e.StackTrace}");
}
try
{
CatchAndRethrowImplicitly();
}
catch (ArithmeticException e)
{
Console.WriteLine($"{Environment.NewLine}Implicitly specified:{Environment.NewLine}{e.StackTrace}");
}
}
void CatchAndRethrowExplicitly()
{
try
{
ThrowException();
}
catch (ArithmeticException e)
{
// Violates the rule.
throw e;
}
}
void CatchAndRethrowImplicitly()
{
try
{
ThrowException();
}
catch (ArithmeticException)
{
// Satisfies the rule.
throw;
}
}
void ThrowException()
{
throw new ArithmeticException("illegal expression");
}
}
Imports System
Namespace ca2200
Class TestsRethrow
Shared Sub Main2200()
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