Delen via


CA2200: Herroepen om stackdetails te behouden

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

Zie ook