CA1065: Jangan munculkan pengecualian di lokasi yang tidak terduga
Properti | Nilai |
---|---|
ID Aturan | CA1065 |
Judul | Tidak memunculkan pengecualian di lokasi yang tidak terduga |
Golongan | Desain |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Metode yang tidak diharapkan untuk memunculkan pengecualian akan memunculkan pengecualian.
Deskripsi aturan
Metode yang tidak diharapkan untuk melempar pengecualian dapat dikategorikan sebagai berikut:
- Metode dapatkan properti
- Metode aksesor peristiwa
- Sama dengan metode
- Metode GetHashCode
- Metode ToString
- Konstruktor statik
- Finalizer
- Buang metode
- Operator Persamaan
- Operator transmisi implisit
Bagian berikut membahas jenis metode ini.
Metode dapatkan properti
Properti pada dasarnya adalah bidang pintar. Oleh karena itu, mereka harus berulah seperti lapangan sebanyak mungkin. Bidang tidak melemparkan pengecualian dan tidak seharusnya properti. 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 melemparkan 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, itu seharusnya hanya kembali 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 mengambil 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 statik
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 melemparkan pengecualian dari konstruktor statis.
Finalizer
Melemparkan pengecualian dari finalizer menyebabkan CLR gagal dengan cepat, yang merobek 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 Dispose(false)
kode tidak boleh melempar pengecualian, karena Dispose
hampir selalu dipanggil dari finalizer.
Operator kesetaraan (==, !=)
Seperti Equals
metode, operator kesetaraan harus mengembalikan pengecualian 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 harus dilemparkan 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 menekan 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.