CA2200: Znovu vyvolejte pro zachování podrobností zásobníku
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2200 |
Název | Znovu vyvolejte pro zachování podrobností zásobníku |
Kategorie | Využití |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | Jako upozornění |
Příčina
Výjimka je rethrown a výjimka je explicitně zadána throw
v příkazu.
Popis pravidla
Po vyvolání výjimky je součástí informací, které přenáší, trasování zásobníku. Trasování zásobníku je seznam hierarchie volání metody, která začíná metodou, která vyvolá výjimku a končí metodou, která zachytí výjimku. Pokud se výjimka opakuje zadáním výjimky v throw
příkazu, trasování zásobníku se restartuje v aktuální metodě a seznam volání metody mezi původní metodou, která vyvolala výjimku a aktuální metoda je ztracena. Chcete-li zachovat původní informace trasování zásobníku s výjimkou, použijte throw
příkaz bez určení výjimky.
Pokud výjimku znovu načítáte z jiného než obslužné rutiny (catch
bloku), použijte ExceptionDispatchInfo.Capture(Exception) k zachycení výjimky v obslužné rutině a ExceptionDispatchInfo.Throw() jejím opětovném rozšíření.
Další informace naleznete v tématu Zachycení a opětovné rozšíření výjimek správně.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, znovu rozevřete výjimku bez explicitního zadání výjimky.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo.
Příklad
Následující příklad ukazuje metodu, CatchAndRethrowExplicitly
která porušuje pravidlo a metodu, CatchAndRethrowImplicitly
která splňuje pravidlo.
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