Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA2200 |
| Titel | Opnieuw gooien om stackdetails te behouden |
| Categorie | Gebruik |
| Fix kan brekend of niet-brekend zijn | Niet-brekend |
| Standaard ingeschakeld in .NET 10 | Als waarschuwing |
| Toepasselijke talen | C# en Visual Basic |
Oorzaak
Een uitzondering wordt opnieuw opgeworpen en de uitzondering wordt expliciet gespecificeerd in de throw instructie.
Beschrijving van regel
Zodra er een uitzondering optreedt, wordt er een deel van de informatie meegegeven, namelijk de stacktrace. De stacktrace is een lijst van de methode-aanroephiƫrarchie die begint met de methode die de uitzondering werpt en eindigt met de methode die de uitzondering vangt. Als een uitzondering opnieuw wordt geworpen door de uitzondering in de throw instructie op te geven, wordt de stack trace opnieuw gestart bij de huidige methode en gaat de lijst met methodeaanroepen tussen de oorspronkelijke methode die de uitzondering opgooide en de huidige methode verloren. Als u de oorspronkelijke stack-traceringsgegevens met de uitzondering wilt behouden, gebruikt u de throw instructie zonder de uitzondering op te geven.
Als u de uitzondering vanaf een andere locatie dan de handler (catch blok) opnieuw wilt gooien, gebruikt u ExceptionDispatchInfo.Capture(Exception) om de uitzondering vast te leggen in de handler en ExceptionDispatchInfo.Throw() als u deze opnieuw wilt gooien.
Voor meer informatie, zie Uitzonderingen afhandelen en opnieuw werpen.
Hoe schendingen op te lossen
Als u een schending van deze regel wilt oplossen, gooit u de uitzondering opnieuw zonder expliciet de uitzondering op te geven.
Wanneer waarschuwingen onderdrukken
Een waarschuwing van deze regel niet onderdrukken.
Voorbeeld
In het volgende voorbeeld ziet u een methode, CatchAndRethrowExplicitlydie in strijd is met de regel en een methode, CatchAndRethrowImplicitlydie voldoet aan de regel.
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