Bagikan melalui


CA1031: Jangan tangkap jenis pengecualian umum

Properti Nilai
ID Aturan CA1031
Judul Jangan menangkap jenis pengecualian umum
Golongan Desain
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 No

Penyebab

Pengecualian umum seperti System.Exception atau System.SystemException tertangkap dalam catch pernyataan, atau klausa tangkapan umum seperti catch() digunakan.

Secara default, aturan ini hanya menandai jenis pengecualian umum yang tertangkap, tetapi ini dapat dikonfigurasi.

Deskripsi aturan

Pengecualian umum tidak boleh ditangkap.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, tangkap pengecualian yang lebih spesifik, atau tangkap kembali pengecualian umum sebagai pernyataan terakhir di catch blok.

Kapan harus menekan peringatan

Jangan menyembunyikan peringatan dari aturan ini. Menangkap jenis pengecualian umum dapat menyembunyikan masalah run-time dari pengguna pustaka dan dapat membuat penelusuran kesalahan lebih sulit.

Catatan

Dimulai dengan .NET Framework 4, runtime bahasa umum (CLR) tidak lagi memberikan pengecualian status rusak yang terjadi dalam sistem operasi dan kode terkelola, seperti pelanggaran akses di Windows, untuk ditangani oleh kode terkelola. Jika Anda ingin mengkompilasi aplikasi di .NET Framework 4 atau versi yang lebih baru dan mempertahankan penanganan pengecualian status yang rusak, Anda dapat menerapkan HandleProcessCorruptedStateExceptionsAttribute atribut ke metode yang menangani pengecualian status rusak.

Mengonfigurasi kode yang akan dianalisis

Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.

Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku untuknya, atau untuk semua aturan dalam kategori ini (Desain) yang berlaku untuk aturan ini. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.

Nama jenis pengecualian yang tidak diizinkan

Anda dapat mengonfigurasi jenis pengecualian mana yang tidak diizinkan untuk tertangkap. Misalnya, untuk menentukan bahwa aturan harus menandai catch handler dengan NullReferenceException, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:

dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException

Format nama jenis yang diizinkan dalam nilai opsi (dipisahkan oleh |):

  • Nama jenis saja (menyertakan semua simbol dengan nama, terlepas dari jenis atau namespace yang berisi)
  • Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol dengan T: awalan.

Contoh:

Nilai opsi Ringkasan
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType Cocok dengan semua simbol bernama 'ExceptionType' dalam kompilasi.
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 Cocok dengan semua simbol bernama 'ExceptionType1' atau 'ExceptionType2' dalam kompilasi.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType Cocok dengan jenis tertentu bernama 'ExceptionType' dengan nama yang sepenuhnya memenuhi syarat.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 Cocok dengan jenis bernama 'ExceptionType1' dan 'ExceptionType2' dengan masing-masing nama yang sepenuhnya memenuhi syarat.

Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku untuknya, atau untuk semua aturan dalam kategori ini (Desain) yang berlaku untuknya. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.

Contoh

Contoh berikut menunjukkan jenis yang melanggar aturan ini dan jenis yang mengimplementasikan catch blok dengan benar.

Imports System
Imports System.IO

Namespace ca1031

    ' Creates two violations of the rule.
    Public Class GenericExceptionsCaught

        Dim inStream As FileStream
        Dim outStream As FileStream

        Sub New(inFile As String, outFile As String)

            Try
                inStream = File.Open(inFile, FileMode.Open)
            Catch ex As SystemException
                Console.WriteLine("Unable to open {0}.", inFile)
            End Try

            Try
                outStream = File.Open(outFile, FileMode.Open)
            Catch
                Console.WriteLine("Unable to open {0}.", outFile)
            End Try

        End Sub

    End Class

    Public Class GenericExceptionsCaughtFixed

        Dim inStream As FileStream
        Dim outStream As FileStream

        Sub New(inFile As String, outFile As String)

            Try
                inStream = File.Open(inFile, FileMode.Open)

                ' Fix the first violation by catching a specific exception.
            Catch ex As FileNotFoundException
                Console.WriteLine("Unable to open {0}.", inFile)
                ' For functionally equivalent code, also catch the
                ' remaining exceptions that may be thrown by File.Open
            End Try

            Try
                outStream = File.Open(outFile, FileMode.Open)

                ' Fix the second violation by re-throwing the generic 
                ' exception at the end of the catch block.
            Catch
                Console.WriteLine("Unable to open {0}.", outFile)
                Throw
            End Try

        End Sub

    End Class

End Namespace
// Creates two violations of the rule.
public class GenericExceptionsCaught
{
    FileStream? inStream;
    FileStream? outStream;

    public GenericExceptionsCaught(string inFile, string outFile)
    {
        try
        {
            inStream = File.Open(inFile, FileMode.Open);
        }
        catch (SystemException)
        {
            Console.WriteLine("Unable to open {0}.", inFile);
        }

        try
        {
            outStream = File.Open(outFile, FileMode.Open);
        }
        catch
        {
            Console.WriteLine("Unable to open {0}.", outFile);
        }
    }
}

public class GenericExceptionsCaughtFixed
{
    FileStream? inStream;
    FileStream outStream;

    public GenericExceptionsCaughtFixed(string inFile, string outFile)
    {
        try
        {
            inStream = File.Open(inFile, FileMode.Open);
        }

        // Fix the first violation by catching a specific exception.
        catch (FileNotFoundException)
        {
            Console.WriteLine("Unable to open {0}.", inFile);
        };

        // For functionally equivalent code, also catch 
        // remaining exceptions that may be thrown by File.Open

        try
        {
            outStream = File.Open(outFile, FileMode.Open);
        }

        // Fix the second violation by rethrowing the generic 
        // exception at the end of the catch block.
        catch
        {
            Console.WriteLine("Unable to open {0}.", outFile);
            throw;
        }
    }
}

CA2200: Munculkan kembali untuk mempertahankan detail tumpukan