Udostępnij za pośrednictwem


CA2200: Należy zgłosić ponownie, aby zachować szczegóły stosu

Właściwości Wartość
Identyfikator reguły CA2200
Tytuł Ponowie zgłoś wyjątek, aby zachować szczegóły stosu
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Jako ostrzeżenie

Przyczyna

Wyjątek jest ponownie wprowadzany, a wyjątek jest jawnie określony w instrukcji throw .

Opis reguły

Po wyrzuceniu wyjątku część informacji, które prowadzi, to ślad stosu. Ślad stosu to lista hierarchii wywołań metody rozpoczynająca się od metody, która zgłasza wyjątek i kończy się metodą, która przechwytuje wyjątek. Jeśli wyjątek zostanie ponownie zgłoszony przez określenie wyjątku throw w instrukcji, ślad stosu zostanie uruchomiony ponownie w bieżącej metodzie i lista wywołań metod między oryginalną metodą, która zwróciła wyjątek i bieżącą metodę zostanie utracona. Aby zachować oryginalne informacje śledzenia stosu z wyjątkiem, użyj throw instrukcji bez określania wyjątku.

Jeśli ponownie wywrócisz wyjątek z innego miejsca niż program obsługi (catch blok), użyj polecenia ExceptionDispatchInfo.Capture(Exception) , aby przechwycić wyjątek w procedurze obsługi i ExceptionDispatchInfo.Throw() kiedy chcesz go ponownie wywrócić.

Aby uzyskać więcej informacji, zobacz Przechwyć i ponownie wzrosić wyjątki prawidłowo.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, wróć wyjątek bez jawnego określenia wyjątku.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.

Przykład

W poniższym przykładzie przedstawiono metodę , CatchAndRethrowExplicitlyktóra narusza regułę i metodę , CatchAndRethrowImplicitlyktóra spełnia regułę.

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

Zobacz też