Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
| 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 romboló vagy nem romboló | Nem törhető |
| Alapértelmezés szerint engedélyezve a .NET 10-ben | Figyelmeztetésként |
| Alkalmazandó nyelvek | C# és Visual Basic |
Ok
A kivétel újra feldobásra kerül, és a kivétel explicit módon meg van jelölve az throw utasításban.
Szabály leírása
Amikor egy kivétel felmerül, az általa hordozott információk egy része a verem visszakövetési nyoma. A veremkövetés a metódushívási hierarchia 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 throw utasításban megadott kivétel újradobják, akkor a veremnyom az aktuális metódusnál újraindul, és elveszik az eredeti metódus és az aktuális metódus közötti metódushívások listája. Az eredeti veremnyomkövetési adatok kivétel melletti megőrzéséhez használja az throw utasítást a kivétel megadása nélkül.
Ha a kivételt a kivételkezelőtől (catch blokktól) eltérő helyről szeretné újból dobni, akkor a ExceptionDispatchInfo.Capture(Exception)-et használja a kivétel rögzítéséhez a kezelőben, és ExceptionDispatchInfo.Throw()-t, amikor újra dobni szeretné.
További információ: A kivételek megfelelő rögzítése és továbbí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 nyomja el a figyelmeztetést ebből a szabályból.
Példa
Az alábbi példa egy metódust mutat be, CatchAndRethrowExplicitlyamely megsérti a szabályt és egy metódust, CatchAndRethrowImplicitlyamely megfelel a szabálynak.
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