CA2200: Znovu vyvolejte pro zachování podrobností zásobníku

Vlastnost Hodnota
ID pravidla CA2200
Název Znovu vyvolejte pro zachování podrobností zásobníku
Kategorie Využití
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako upozornění
Příslušné jazyky C# a Visual Basic

Příčina

Výjimka je znovu vyhozena a výjimka je explicitně specifikována v throw příkazu.

Popis pravidla

Po vyvolání výjimky je jednou z informací, které přenáší, zásobníková stopa. Výpis zásobníku je seznam hierarchie volání metod, která začíná metodou, jež výjimku vyvolá, a končí metodou, jež výjimku zachytí. Pokud je výjimka znovu vyvolána specifikací výjimky v příkazu throw, trasování zásobníku se restartuje v aktuální metodě a seznam volání metod mezi původní metodou, která vyvolala výjimku, a aktuální metodou se ztratí. Chcete-li zachovat původní informace trasování zásobníku s výjimkou, použijte throw příkaz bez určení výjimky.

Pokud znovu vyvoláváte výjimku odjinud než z obslužné rutiny (catch bloku), použijte ExceptionDispatchInfo.Capture(Exception) ke zachycení výjimky v obslužné rutině a ExceptionDispatchInfo.Throw() při jejím znovu vyvolání.

Další informace naleznete v tématu Zachycení a opětovné vyvolání výjimek správně.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, vyvolejte výjimku znovu, aniž byste ji explicitně uvedli.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad

Následující příklad ukazuje metodu, CatchAndRethrowExplicitlykterá porušuje pravidlo a metodu, CatchAndRethrowImplicitlykterá splňuje pravidlo.

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

Viz také