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 9 | No |
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)
{
}
}