Praktik terbaik dalam menangani pengecualian di C #

Penanganan pengecualian adalah teknik menangani error runtime dalam kode aplikasi Anda. Pada dasarnya, Anda memiliki dua kategori pengecualian: Pengecualian yang dibuat oleh aplikasi dan yang dibuat oleh runtime. Pengecualian harus ditangani dengan hati-hati - Anda harus memiliki gagasan yang baik tentang bagaimana pengecualian harus ditangani dan kapan mereka perlu ditangani dalam kode Anda. Dalam posting ini, saya akan menyajikan beberapa tip dan praktik terbaik untuk bekerja dengan pengecualian di C #.

Kelas dasar untuk semua pengecualian di .NET adalah Pengecualian. Semua kelas pengecualian dalam hierarki pengecualian diturunkan secara langsung atau tidak langsung dari kelas ini. Kelas ApplicationException dan SystemException diturunkan dari kelas Exception. Common Language Runtime (CLR) melontarkan instance dari tipe yang diturunkan dari SystemException saat kesalahan terjadi saat runtime. Perhatikan bahwa Anda tidak boleh menangkap SystemException atau menampilkan instance SystemException dalam kode aplikasi Anda.

Saat membuat kelas pengecualian khusus, selalu berasal dari kelas Exception dan bukan dari kelas ApplicationException. Salah satu alasannya adalah bahwa instance ApplicationException dilemparkan oleh aplikasi dan tidak pernah dilemparkan oleh runtime. Dalam melempar instance ApplicationException dalam kode Anda, Anda hanya akan meningkatkan tumpukan panggilan tanpa menambahkan banyak nilai.

Ini adalah pendekatan desain yang buruk untuk menggunakan penanganan pengecualian untuk mengembalikan informasi dari suatu metode. Jika Anda mengembalikan data pengecualian dari metode Anda, desain kelas Anda salah dan harus ditinjau kembali. Perhatikan bahwa pengecualian dialihkan ke tingkat yang lebih tinggi dalam hierarki panggilan metode dan menangani pengecualian di semua lapisan aplikasi Anda bukanlah praktik yang baik. Anda harus menangani pengecualian sebagai yang lebih tinggi dalam hierarki panggilan yang Anda bisa - Anda bisa menggunakan pengecualian di lapisan presentasi dan menampilkan pesan yang sesuai kepada pengguna untuk memberi tahu kesalahan persis yang telah terjadi.

Melempar ulang pengecualian diperlukan saat Anda ingin melakukan rollback transaksi database. Merupakan praktik yang baik untuk menggunakan pengecualian khusus seperti FileNotFoundException, IOException, dll. Saat menulis penangan pengecualian dan kemudian blok catch umum di bagian akhir dengan kelas Exception. Ini akan memastikan bahwa Anda mengetahui kesalahan sebenarnya atau kesalahan spesifik yang telah terjadi. MSDN menyatakan: "Kelas ApplicationException tidak memberikan informasi tentang penyebab pengecualian. Dalam kebanyakan skenario, contoh kelas ini tidak boleh dilempar. Dalam kasus di mana kelas ini dipakai, pesan yang dapat dibaca manusia yang menjelaskan kesalahan harus diteruskan ke konstruktor. "

Anda harus menggunakan blok try - catch untuk menangani pengecualian dan menggunakan blok akhirnya untuk membersihkan sumber daya yang digunakan dalam program Anda. Blok try akan berisi kode yang mungkin memunculkan pengecualian, blok catch akan digunakan untuk menangani pengecualian yang dilemparkan ke dalam blok try dan blok terakhir akan digunakan untuk membatalkan alokasi sumber daya apa pun yang telah digunakan program. Perhatikan bahwa blok terakhir dijamin akan dieksekusi terlepas dari apakah pengecualian telah terjadi atau tidak. Karenanya, akhirnya blokir adalah tempat terbaik dalam kode Anda untuk membersihkan sumber daya yang telah digunakan program Anda.

Potongan kode di bawah ini menunjukkan bagaimana pernyataan "using" dapat digunakan untuk membuang sumber daya. Perhatikan bahwa pernyataan "using" sama dengan blok coba - akhirnya.

public string Read(string fileName)

{

try

{

string data;

using (StreamReader streamReader = new StreamReader(fileName))

{

data = streamReader.ReadToEnd();

}

return data;

}

catch (Exception)

{

throw;

}

}

Melempar pengecualian itu mahal. Melontarkan ulang pengecualian merupakan praktik yang buruk - dalam mengembalikan pengecualian, Anda akan kehilangan jejak tumpukan.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

throw ex;

}

Sebagai gantinya, cukup gunakan pernyataan "throw" jika Anda tidak ingin menangani pengecualian dalam penangan pengecualian Anda dan menyebarkan pengecualian ke atas dalam hierarki panggilan.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

throw;

}

Jangan pernah menelan pengecualian - Anda tidak boleh menyembunyikan kesalahan yang telah terjadi. Mencatat pengecualian di aplikasi Anda merupakan praktik yang baik. Saat membuat log pengecualian, Anda harus selalu mencatat instance pengecualian sehingga pelacakan tumpukan lengkap dicatat dan bukan hanya pesan pengecualian. Berikut adalah contoh yang menggambarkan hal ini.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

LogManager.Log(ex.ToString());

}

Anda tidak boleh menggunakan pengecualian untuk menyebarkan atau menjalankan aturan bisnis dalam aplikasi Anda. Anda dapat menghindari pengecualian dalam kode Anda dengan menggunakan logika validasi yang tepat. Pengecualian dalam banyak kasus harus dihindari - Anda harus menggunakannya hanya jika diperlukan.

Anda dapat merujuk ke artikel MSDN ini untuk informasi lebih lanjut.