Saya biasanya setuju dengan sebagian besar peringatan analisis kode, dan saya berusaha untuk mematuhinya. Namun, saya mengalami kesulitan dengan yang ini:
CA1031: Jangan menangkap jenis pengecualian umum
Saya mengerti alasan untuk aturan ini. Tetapi, dalam praktiknya, jika saya ingin mengambil tindakan yang sama terlepas dari pengecualian yang dilontarkan, mengapa saya harus menangani masing-masing secara khusus? Selanjutnya, jika saya menangani pengecualian tertentu, bagaimana jika kode yang saya panggil perubahan untuk melemparkan pengecualian baru di masa depan? Sekarang saya harus mengubah kode saya untuk menangani pengecualian baru itu. Sedangkan jika saya hanya menangkap Exception
kode saya tidak perlu berubah.
Misalnya, jika Foo memanggil Bar, dan Foo perlu berhenti memproses terlepas dari jenis pengecualian yang dilemparkan oleh Bar, apakah ada keuntungan untuk menjadi spesifik tentang jenis pengecualian yang saya tangkap?
Mungkin contoh yang lebih baik:
public void Foo()
{
// Some logic here.
LogUtility.Log("some message");
}
public static void Log()
{
try
{
// Actual logging here.
}
catch (Exception ex)
{
// Eat it. Logging failures shouldn't stop us from processing.
}
}
Jika Anda tidak menangkap pengecualian umum di sini, maka Anda harus menangkap setiap jenis pengecualian yang mungkin. Patrick punya poin bagus yang OutOfMemoryException
tidak boleh ditangani dengan cara ini. Jadi bagaimana jika saya ingin mengabaikan setiap pengecualian tetapi OutOfMemoryException
?
OutOfMemoryError
, yang terpisah dari Exception
pohon warisan karena alasan itu
OutOfMemoryException
? Kode penanganan yang sama dengan yang lainnya?