Baca dalam bahasa Inggris

Bagikan melalui


CA2200: Munculkan kembali untuk mempertahankan detail tumpukan

Properti Nilai
ID Aturan CA2200
Judul Memunculkan ulang untuk mempertahankan detail tumpukan
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 9 Sebagai peringatan

Penyebab

Pengecualian ditumbuhkan kembali dan pengecualian secara eksplisit ditentukan dalam throw pernyataan.

Deskripsi aturan

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

Jika Anda menumbuhkan kembali pengecualian dari suatu tempat selain handler (catch blok), gunakan ExceptionDispatchInfo.Capture(Exception) untuk menangkap pengecualian di handler dan ExceptionDispatchInfo.Throw() kapan Anda ingin memutusnya kembali.

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.

C#
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");
    }
}

Lihat juga