CA2200: Újrafedés a verem részleteinek megőrzése érdekében
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA2200 |
Cím | Újrafedés a verem részleteinek megőrzése érdekében |
Kategória | Használat |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 9-ben | Figyelmeztetésként |
Ok
A kivétel újra létre lesz adva, és a kivétel explicit módon meg van adva az throw
utasításban.
Szabály leírása
A kivétel kivédése után az általa hordozott információk egy része a verem nyomkövetése. A veremkövetés a metódushívási hierarchia azon hierarchiájának listája, amely azzal a metódussal kezdődik, amely a kivételt eldobja, és a kivételt elkapó metódussal végződik. Ha a kivételt az utasításban throw
szereplő kivétel megadásával újrakezdik, a verem nyomkövetése az aktuális metódusnál újraindul, és a metódushívások listája az eredeti metódus között, amely a kivételt eldobta, és az aktuális metódus elveszik. Az eredeti verem nyomkövetési adatainak kivétellel való megőrzéséhez használja az throw
utasítást a kivétel megadása nélkül.
Ha a kivételt a kezelőtől (catch
blokktól) eltérő helyről szeretné újból létrehozni, akkor a ExceptionDispatchInfo.Capture(Exception) kivétel rögzítéséhez használja a kezelőben, és ExceptionDispatchInfo.Throw() amikor újra meg szeretné oldani.
További információ: A kivételek rögzítése és újbóli visszaállítása.
Szabálysértések kijavítása
A szabály megsértésének kijavításához a kivétel explicit megadása nélkül hárítsa el újra a kivételt.
Mikor kell letiltani a figyelmeztetéseket?
Ne tiltsa el a szabály figyelmeztetését.
Példa
Az alábbi példa egy metódust mutat be, CatchAndRethrowExplicitly
amely megsérti a szabályt és egy metódust, CatchAndRethrowImplicitly
amely megfelel a szabálynak.
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