CA2200: Lempar ulang untuk mempertahankan informasi tumpukan

Properti Nilai
ID Aturan CA2200
Judul Melemparkan ulang untuk mempertahankan rincian tumpukan
Kategori Penggunaan
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Sebagai peringatan
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Pengecualian dilempar ulang dan secara eksplisit ditentukan dalam pernyataan throw.

Deskripsi aturan

Setelah pengecualian dilemparkan, bagian dari informasi yang dikandungnya adalah jejak tumpukan. Jejak tumpukan adalah daftar hierarki panggilan metode yang dimulai dengan metode yang melempar pengecualian dan berakhir dengan metode yang menangkap pengecualian. Jika pengecualian dilemparkan kembali dengan menyebutkan pengecualian dalam pernyataan throw, penelusuran tumpukan dimulai ulang pada metode saat ini dan daftar panggilan metode antara metode asli yang melempar pengecualian dan metode saat ini akan hilang. Untuk menyimpan informasi pelacakan tumpukan asli ketika terjadi pengecualian, gunakan pernyataan throw tanpa menentukan pengecualian.

Jika Anda melempar ulang pengecualian dari suatu tempat selain dari handler (catch blok), gunakan ExceptionDispatchInfo.Capture(Exception) untuk menangkap pengecualian di handler dan ExceptionDispatchInfo.Throw() ketika Anda ingin melempar ulangnya.

Untuk informasi selengkapnya, lihat Menangkap dan menumbuhkan kembali pengecualian dengan benar.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, keluarkan kembali pengecualian tanpa menentukan pengecualian secara eksplisit.

Kapan harus menekan peringatan

Jangan menyembunyikan peringatan dari aturan ini.

Contoh

Contoh berikut menunjukkan metode, CatchAndRethrowExplicitly, yang melanggar aturan dan metode , CatchAndRethrowImplicitlyyang memenuhi aturan.

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

Lihat juga