Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA1065 |
| Judul | Tidak memunculkan pengecualian di lokasi yang tidak terduga |
| Kategori | Desain |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Tidak |
| Bahasa yang berlaku | C# dan Visual Basic |
Penyebab
Metode yang seharusnya tidak menyebabkan pengecualian ternyata menyebabkan pengecualian.
Deskripsi aturan
Metode yang tidak diharapkan untuk melempar pengecualian dapat dikategorikan sebagai berikut:
- Metode pengambil properti
- Metode akses event
- Sama dengan metode
- Metode GetHashCode
- Metode ToString
- Konstruktor statis
- Finalizers
- Buang metode
- Operator Persamaan
- Operator transmisi implisit
Bagian berikut membahas jenis metode ini.
Metode akses properti
Properti pada dasarnya adalah bidang pintar. Oleh karena itu, mereka harus berfungsi seperti bidang semaksimal mungkin. Field tidak melempar pengecualian, dan properti juga tidak seharusnya. Jika Anda memiliki properti yang melempar pengecualian, pertimbangkan untuk menjadikannya metode .
Pengecualian berikut dapat dilemparkan dari metode dapatkan properti:
- System.InvalidOperationException dan semua turunan (termasuk System.ObjectDisposedException)
- System.NotSupportedException dan semua turunan
- System.ArgumentException (hanya dari get terindeks)
- System.Collections.Generic.KeyNotFoundException (hanya dari get terindeks)
Metode aksesor peristiwa
Aksesor peristiwa harus berupa operasi sederhana yang tidak memunculkan pengecualian. Peristiwa tidak boleh melemparkan pengecualian saat Anda mencoba menambahkan atau menghapus penanganan aktivitas.
Pengecualian berikut dapat dilemparkan dari aksesor peristiwa:
- System.InvalidOperationException dan semua turunan (termasuk System.ObjectDisposedException)
- System.NotSupportedException dan semua turunan
- System.ArgumentException dan turunannya
Sama dengan metode
Metode Equals berikut tidak boleh melemparkan pengecualian:
Metode Equals harus mengembalikan true atau false alih-alih melempar pengecualian. Misalnya, jika Equals diteruskan dua jenis yang tidak cocok, seharusnya cukup mengembalikan false alih-alih melempar ArgumentException.
Metode GetHashCode
Metode berikut GetHashCode biasanya tidak boleh melemparkan pengecualian:
GetHashCode harus selalu mengembalikan nilai. Jika tidak, Anda dapat kehilangan item dalam tabel hash.
Versi GetHashCode yang menerima argumen dapat melempar ArgumentException. Namun, Object.GetHashCode jangan pernah melemparkan pengecualian.
Metode ToString
Debugger menggunakan System.Object.ToString untuk membantu menampilkan informasi tentang objek dalam format string. Oleh karena itu, ToString tidak boleh mengubah status objek, dan seharusnya tidak melemparkan pengecualian.
Konstruktor statis
Melemparkan pengecualian dari konstruktor statis menyebabkan jenis tidak dapat digunakan di domain aplikasi saat ini. Anda harus memiliki alasan yang baik (seperti masalah keamanan) untuk melontarkan pengecualian dari konstruktor statis.
Finalizers
Melemparkan pengecualian dari finalizer menyebabkan CLR gagal dengan cepat, yang menghentikan prosesnya. Oleh karena itu, hindari melemparkan pengecualian dalam finalizer.
Buang metode
Metode System.IDisposable.Dispose tidak boleh melemparkan pengecualian.
Dispose sering disebut sebagai bagian dari logika pembersihan dalam klausul finally . Oleh karena itu, secara eksplisit melemparkan pengecualian dari Dispose memaksa pengguna untuk menambahkan penanganan pengecualian di dalam finally klausa.
Jalur kode Dispose(false) tidak boleh melempar pengecualian sama sekali, karena Dispose hampir selalu dipanggil dari finalizer.
Operator kesetaraan (==, !=)
Seperti metode Equals, operator kesetaraan harus mengembalikan true atau false, dan tidak boleh melemparkan pengecualian.
Operator transmisi implisit
Karena pengguna sering tidak menyadari bahwa operator cast implisit telah dipanggil, pengecualian yang dilemparkan oleh operator cast implisit tidak terduga. Oleh karena itu, tidak ada pengecualian yang boleh dihasilkan dari operator cast implisit.
Cara memperbaiki pelanggaran
Untuk getter properti, ubah logika sehingga tidak lagi harus melempar pengecualian, atau mengubah properti menjadi metode.
Untuk semua jenis metode lain yang tercantum sebelumnya, ubah logika sehingga tidak lagi harus melemparkan pengecualian.
Kapan harus menekan peringatan
Jika pelanggaran disebabkan oleh deklarasi pengecualian alih-alih pengecualian yang dilemparkan, aman untuk mengabaikan peringatan dari aturan ini.
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 CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.