Amalan terbaik dalam menangani pengecualian di C #

Pengendalian pengecualian adalah teknik menangani kesalahan runtime dalam kod aplikasi anda. Pada asasnya, anda mempunyai dua kategori pengecualian: Pengecualian yang dihasilkan oleh aplikasi dan yang dihasilkan oleh runtime. Pengecualian harus ditangani dengan berhati-hati - anda harus mempunyai idea yang baik tentang bagaimana pengecualian harus ditangani dan kapan ia perlu dikendalikan dalam kod anda. Dalam catatan ini, saya akan mengemukakan beberapa petua dan amalan terbaik untuk bekerja dengan pengecualian di C #.

Kelas asas untuk semua pengecualian dalam .NET adalah Pengecualian. Semua kelas pengecualian dalam hierarki pengecualian berasal secara langsung atau tidak langsung dari kelas ini. Kelas ApplicationException dan SystemException berasal dari kelas Exception. The Common Language Runtime (CLR) membuang contoh jenis yang berasal dari SystemException apabila ralat berlaku pada waktu runtime. Perhatikan bahawa anda tidak boleh menangkap SystemException atau membuang contoh SystemException dalam kod aplikasi anda.

Semasa membuat kelas pengecualian tersuai, selalu berasal dari kelas Pengecualian dan bukan dari kelas ApplicationException. Salah satu sebab untuk ini adalah bahawa contoh ApplicationException dilemparkan oleh aplikasi dan tidak pernah dijalankan. Dalam membuang contoh ApplicationException dalam kod anda, anda hanya akan menambah timbunan panggilan tanpa menambah banyak nilai.

Ini adalah pendekatan reka bentuk yang buruk untuk menggunakan pengendalian pengecualian untuk mengembalikan maklumat dari satu kaedah. Sekiranya anda mengembalikan data pengecualian dari kaedah anda, reka bentuk kelas anda salah dan harus dikaji semula. Perhatikan bahawa pengecualian dilancarkan hingga ke tahap yang lebih tinggi dalam kaedah panggilan hierarki dan bukan merupakan amalan yang baik untuk menangani pengecualian di semua lapisan aplikasi anda. Anda harus menangani pengecualian yang lebih tinggi dalam hierarki panggilan yang anda boleh - anda boleh menggunakan pengecualian di lapisan persembahan dan memaparkan mesej yang sesuai kepada pengguna untuk memberitahu kesalahan yang telah terjadi.

Melakukan pengecualian semula diperlukan apabila anda ingin mengembalikan transaksi pangkalan data. Merupakan amalan yang baik untuk menggunakan pengecualian tertentu seperti FileNotFoundException, IOException, dan lain-lain semasa menulis pengendali pengecualian dan kemudian blok tangkapan umum di akhir dengan kelas Pengecualian. Ini akan memastikan bahawa anda dapat mengetahui kesalahan yang tepat atau kesalahan tertentu yang telah berlaku. MSDN menyatakan: "Kelas ApplicationException tidak memberikan maklumat mengenai sebab pengecualian. Dalam kebanyakan senario, contoh kelas ini tidak boleh dilemparkan. Sekiranya kelas ini dibuat, mesej yang boleh dibaca oleh manusia yang menjelaskan kesalahan tersebut seharusnya diserahkan kepada pembina. "

Anda harus menggunakan blok try-catch untuk menangani pengecualian dan menggunakan blok akhirnya untuk membersihkan sumber yang digunakan dalam program anda. Blok percubaan akan mengandungi kod yang mungkin menimbulkan pengecualian, blok tangkapan akan digunakan untuk menangani pengecualian yang dilemparkan di dalam blok percubaan dan blok akhirnya akan digunakan untuk menyahpindah sumber yang telah digunakan oleh program. Perhatikan bahawa blok akhirnya dijamin akan dilaksanakan tanpa mengira pengecualian telah berlaku atau tidak. Oleh itu, akhirnya blok adalah tempat terbaik dalam kod anda untuk membersihkan sumber yang telah digunakan oleh program anda.

Coretan kod di bawah menunjukkan bagaimana penyataan "menggunakan" dapat digunakan untuk membuang sumber. Perhatikan bahawa pernyataan "menggunakan" adalah setara dengan cubaan - akhirnya blok.

public string Read(string fileName)

{

try

{

string data;

using (StreamReader streamReader = new StreamReader(fileName))

{

data = streamReader.ReadToEnd();

}

return data;

}

catch (Exception)

{

throw;

}

}

Membuang pengecualian adalah mahal. Merupakan amalan yang tidak baik untuk mengubah semula pengecualian - dengan mengubah semula pengecualian, anda akan kehilangan jejak timbunan.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

throw ex;

}

Sebaliknya, gunakan pernyataan "buang" jika anda tidak mahu menangani pengecualian dalam pengendali pengecualian anda dan menyebarkan pengecualian ke atas dalam hierarki panggilan.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

throw;

}

Jangan sekali-kali menelan pengecualian - anda tidak boleh menyembunyikan kesalahan yang telah berlaku. Merupakan amalan yang baik untuk log pengecualian dalam aplikasi anda. Semasa membuat pengecualian log, anda harus selalu mencatat contoh pengecualian sehingga jejak timbunan lengkap dicatat dan bukan hanya mesej pengecualian. Berikut adalah contoh yang menggambarkan perkara ini.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

LogManager.Log(ex.ToString());

}

Anda tidak boleh menggunakan pengecualian untuk menyebarkan atau melaksanakan peraturan perniagaan dalam aplikasi anda. Anda boleh mengelakkan pengecualian dalam kod anda dengan menggunakan logik pengesahan yang betul. Pengecualian dalam kebanyakan kes harus dielakkan - anda harus menggunakannya hanya apabila diperlukan.

Anda boleh merujuk artikel MSDN ini untuk maklumat lebih lanjut.