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 8-ban 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, CatchAndRethrowExplicitlyamely megsérti a szabályt és egy metódust, CatchAndRethrowImplicitlyamely 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

Lásd még