CA1031: Jangan tangkap jenis pengecualian umum
Properti | Nilai |
---|---|
ID Aturan | CA1031 |
Judul | Jangan menangkap jenis pengecualian umum |
Golongan | Desain |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Pengecualian umum seperti System.Exception atau System.SystemException tertangkap dalam catch
pernyataan, atau klausa tangkapan umum seperti catch()
digunakan.
Secara default, aturan ini hanya menandai jenis pengecualian umum yang tertangkap, tetapi ini dapat dikonfigurasi.
Deskripsi aturan
Pengecualian umum tidak boleh ditangkap.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, tangkap pengecualian yang lebih spesifik, atau tangkap kembali pengecualian umum sebagai pernyataan terakhir di catch
blok.
Kapan harus menekan peringatan
Jangan menyembunyikan peringatan dari aturan ini. Menangkap jenis pengecualian umum dapat menyembunyikan masalah run-time dari pengguna pustaka dan dapat membuat penelusuran kesalahan lebih sulit.
Catatan
Dimulai dengan .NET Framework 4, runtime bahasa umum (CLR) tidak lagi memberikan pengecualian status rusak yang terjadi dalam sistem operasi dan kode terkelola, seperti pelanggaran akses di Windows, untuk ditangani oleh kode terkelola. Jika Anda ingin mengkompilasi aplikasi di .NET Framework 4 atau versi yang lebih baru dan mempertahankan penanganan pengecualian status yang rusak, Anda dapat menerapkan HandleProcessCorruptedStateExceptionsAttribute atribut ke metode yang menangani pengecualian status rusak.
Mengonfigurasi kode yang akan dianalisis
Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.
Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku untuknya, atau untuk semua aturan dalam kategori ini (Desain) yang berlaku untuk aturan ini. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.
Nama jenis pengecualian yang tidak diizinkan
Anda dapat mengonfigurasi jenis pengecualian mana yang tidak diizinkan untuk tertangkap. Misalnya, untuk menentukan bahwa aturan harus menandai catch
handler dengan NullReferenceException
, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Format nama jenis yang diizinkan dalam nilai opsi (dipisahkan oleh |
):
- Nama jenis saja (menyertakan semua simbol dengan nama, terlepas dari jenis atau namespace yang berisi)
- Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol dengan
T:
awalan.
Contoh:
Nilai opsi | Ringkasan |
---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Cocok dengan semua simbol bernama 'ExceptionType' dalam kompilasi. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
Cocok dengan semua simbol bernama 'ExceptionType1' atau 'ExceptionType2' dalam kompilasi. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Cocok dengan jenis tertentu bernama 'ExceptionType' dengan nama yang sepenuhnya memenuhi syarat. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Cocok dengan jenis bernama 'ExceptionType1' dan 'ExceptionType2' dengan masing-masing nama yang sepenuhnya memenuhi syarat. |
Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku, atau untuk semua aturan dalam kategori ini (Desain) yang diterapkannya. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.
Contoh
Contoh berikut menunjukkan jenis yang melanggar aturan ini dan jenis yang mengimplementasikan catch
blok dengan benar.
Imports System
Imports System.IO
Namespace ca1031
' Creates two violations of the rule.
Public Class GenericExceptionsCaught
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
Catch ex As SystemException
Console.WriteLine("Unable to open {0}.", inFile)
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
Catch
Console.WriteLine("Unable to open {0}.", outFile)
End Try
End Sub
End Class
Public Class GenericExceptionsCaughtFixed
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
' Fix the first violation by catching a specific exception.
Catch ex As FileNotFoundException
Console.WriteLine("Unable to open {0}.", inFile)
' For functionally equivalent code, also catch the
' remaining exceptions that may be thrown by File.Open
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
' Fix the second violation by re-throwing the generic
' exception at the end of the catch block.
Catch
Console.WriteLine("Unable to open {0}.", outFile)
Throw
End Try
End Sub
End Class
End Namespace
// Creates two violations of the rule.
public class GenericExceptionsCaught
{
FileStream? inStream;
FileStream? outStream;
public GenericExceptionsCaught(string inFile, string outFile)
{
try
{
inStream = File.Open(inFile, FileMode.Open);
}
catch (SystemException)
{
Console.WriteLine($"Unable to open {inFile}.");
}
try
{
outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine($"Unable to open {outFile}.");
}
}
}
public class GenericExceptionsCaughtFixed
{
FileStream? inStream;
FileStream outStream;
public GenericExceptionsCaughtFixed(string inFile, string outFile)
{
try
{
inStream = File.Open(inFile, FileMode.Open);
}
// Fix the first violation by catching a specific exception.
catch (FileNotFoundException)
{
Console.WriteLine($"Unable to open {inFile}.");
};
// For functionally equivalent code, also catch
// remaining exceptions that may be thrown by File.Open
try
{
outStream = File.Open(outFile, FileMode.Open);
}
// Fix the second violation by rethrowing the generic
// exception at the end of the catch block.
catch
{
Console.WriteLine($"Unable to open {outFile}.");
throw;
}
}
}
Aturan terkait
CA2200: Munculkan kembali untuk mempertahankan detail tumpukan