Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA2200 |
| Název | Znovu vyvolejte pro zachování podrobností zásobníku |
| Kategorie | Využití |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Jako upozornění |
| Příslušné jazyky | C# a Visual Basic |
Příčina
Výjimka je znovu vyhozena a výjimka je explicitně specifikována v throw příkazu.
Popis pravidla
Po vyvolání výjimky je jednou z informací, které přenáší, zásobníková stopa. Výpis zásobníku je seznam hierarchie volání metod, která začíná metodou, jež výjimku vyvolá, a končí metodou, jež výjimku zachytí. Pokud je výjimka znovu vyvolána specifikací výjimky v příkazu throw, trasování zásobníku se restartuje v aktuální metodě a seznam volání metod mezi původní metodou, která vyvolala výjimku, a aktuální metodou se ztratí. 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 znovu vyvoláváte výjimku odjinud než z obslužné rutiny (catch bloku), použijte ExceptionDispatchInfo.Capture(Exception) ke zachycení výjimky v obslužné rutině a ExceptionDispatchInfo.Throw() při jejím znovu vyvolání.
Další informace naleznete v tématu Zachycení a opětovné vyvolání výjimek správně.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, vyvolejte výjimku znovu, aniž byste ji explicitně uvedli.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo.
Příklad
Následující příklad ukazuje metodu, CatchAndRethrowExplicitlykterá porušuje pravidlo a metodu, CatchAndRethrowImplicitlykterá splňuje pravidlo.
class TestsRethrow
{
static void Main2200()
{
TestsRethrow testRethrow = new();
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