Bagikan melalui


CA1064: Pengecualian harus bersifat publik

Properti Nilai
ID Aturan CA1064
Judul Pengecualian harus berskala publik
Golongan Desain
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

Penyebab

Pengecualian non-publik berasal langsung dari Exception, , SystemExceptionatau ApplicationException.

Deskripsi aturan

Pengecualian internal hanya terlihat di dalam cakupan internalnya sendiri. Setelah pengecualian berada di luar cakupan internal, hanya pengecualian dasar yang dapat digunakan untuk menangkap pengecualian. Jika pengecualian internal diwarisi dari Exception, SystemException, atau ApplicationException, kode eksternal tidak akan memiliki informasi yang cukup untuk mengetahui apa yang harus dilakukan dengan pengecualian tersebut.

Tetapi, jika kode memiliki pengecualian publik yang nantinya digunakan sebagai basis untuk pengecualian internal, wajar untuk mengasumsikan kode lebih lanjut akan dapat melakukan sesuatu yang cerdas dengan pengecualian dasar. Pengecualian publik akan memiliki lebih banyak informasi daripada apa yang disediakan oleh Exception, , SystemExceptionatau ApplicationException.

Cara memperbaiki pelanggaran

Buat pengecualian publik, atau dapatkan pengecualian internal dari pengecualian publik yang bukan Exception, , SystemExceptionatau ApplicationException.

Kapan harus menekan peringatan

Sembunyikan pesan dari aturan ini jika Anda yakin dalam semua kasus bahwa pengecualian privat akan tertangkap dalam cakupan internalnya sendiri.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA1064
// The code that's violating the rule is on this line.
#pragma warning restore CA1064

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA1064.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh

Aturan ini diaktifkan pada metode contoh pertama, FirstCustomException karena kelas pengecualian berasal langsung dari Pengecualian dan bersifat internal. Aturan tidak diaktifkan pada kelas SecondCustomException karena meskipun kelas juga berasal langsung dari Pengecualian, kelas dinyatakan publik. Kelas ketiga juga tidak mengaktifkan aturan karena tidak berasal langsung dari System.Exception, , System.SystemExceptionatau System.ApplicationException.

// Violates this rule
[Serializable]
internal class FirstCustomException : Exception
{
    internal FirstCustomException()
    {
    }

    internal FirstCustomException(string message)
        : base(message)
    {
    }

    internal FirstCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    protected FirstCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

// Does not violate this rule because
// SecondCustomException is public
[Serializable]
public class SecondCustomException : Exception
{
    public SecondCustomException()
    {
    }

    public SecondCustomException(string message)
        : base(message)
    {

    }

    public SecondCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    protected SecondCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

// Does not violate this rule because
// ThirdCustomException it does not derive directly from
// Exception, SystemException, or ApplicationException
[Serializable]
internal class ThirdCustomException : SecondCustomException
{
    internal ThirdCustomException()
    {
    }

    internal ThirdCustomException(string message)
        : base(message)
    {
    }

    internal ThirdCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }


    protected ThirdCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}