Bagikan melalui


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:

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:

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.

Lihat juga