Untuk melempar pengecualian, saya biasanya menggunakan kelas pengecualian bawaan, misalnya ArgumentNullException
dan NotSupportedException
. Namun, terkadang saya perlu menggunakan pengecualian khusus dan dalam kasus itu saya menulis:
class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }
dan seterusnya. Lalu saya melempar dan menangkap ini dalam kode saya. Tapi hari ini saya menemukan ApplicationException
kelas - haruskah saya menggunakannya? Untuk apa ini?
Tampaknya tidak efisien untuk memiliki banyak kelas Pengecualian yang identik secara efektif identik dengan nama yang berbeda (saya biasanya tidak memerlukan fungsionalitas individu). Tapi saya tidak suka ide menangkap generik ApplicationException
dan harus menggunakan kode tambahan untuk menentukan apa kesalahannya.
Di mana harus ApplicationException
cocok dengan kode saya?
sumber
Jawaban:
Menurut komentar di msdn:
Turunkan mereka dari
Exception
. Juga, saya tidak melihat masalah dengan membuat pengecualian baru untuk kasus Anda, selama itu dibenarkan. Jika Anda menemukan kasus di mana sudah ada pengecualian dalam kerangka kerja, gunakan itu, jika tidak, gulung sendiri.sumber
ApplicationException
tidak berguna dan apakah ada hanya karena kompatibilitas ke belakang?Jawaban singkatnya adalah: tidak ada tempat.
Ini adalah peninggalan masa lalu, di mana Microsoft bermaksud pengembang untuk mewarisi semua pengecualian khusus dari ApplicationException. Tak lama kemudian, mereka berubah pikiran dan menyarankan bahwa pengecualian khusus harus berasal dari kelas Pengecualian dasar. Lihat Praktik Terbaik untuk Menangani Pengecualian di MSDN.
Salah satu alasan yang lebih luas beredar untuk ini berasal dari kutipan dari Jeffery Richter dalam Kerangka Desain Pedoman :
Jadi begitulah. Ringkasan eksekutif adalah bahwa ApplicationException tidak berbahaya , hanya tidak berguna .
sumber
Whizbang
memutuskan bahwa ia ingin memiliki semua pengecualian di bawah beberapa hierarki umum, menggunakanApplicationException
untuk tujuan itu akan benar-benar tidak menawarkan keuntungan dibandingkan menggunakanWhizbangException
kelas dasar kustom . Namun, masalah yang lebih serius dalam hierarki pengecualian .net tidak ada padaApplicationException
, namun dengan kegagalan memisahkan pengecualian ke dalam kategori yang mungkin terkait dengan aplikasi, fatal, fatal, dan terkait masalah lokal, serta ketidakmampuan untuk memiliki pengecualian "komposit" yang berarti.finally
blok sementara pengecualian lain sedang tertunda,catch
blok lebih jauh ke tumpukan panggilan harus dipicu jika mereka cocok dengan pengecualian bersarang, tetapi meninggalkan pengecualian lain yang tertunda sehingga keluar sebuahcatch
blok akan dilanjutkan kecatch
blok lain dalam blok yang samatry
(jika ada yang cocok), dan keluar darifinally
blok dengan pengecualian yang tertunda akan melompat ke luarcatch
atau berikutnyafinally
.Dalam desain awal, dalam. NET 1.0, direncanakan bahwa kerangka itu sendiri akan dibuang
SystemException
dan diturunkan; sementara aplikasi pengguna - akan melemparApplicationException
dan diturunkan.Tetapi kemudian, dalam. NET 2.0, itu dijatuhkan.
Jadi berasal dari
Exception
.sumber