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 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

Lásd még