Pengecualian adalah kesalahan pemblokiran .
Pertama-tama, praktik terbaik seharusnya jangan melemparkan pengecualian untuk segala jenis kesalahan, kecuali itu adalah kesalahan pemblokiran .
Jika kesalahannya memblokir , maka lontarkan pengecualian. Setelah pengecualian dilemparkan, tidak perlu menyembunyikannya karena itu luar biasa; beri tahu pengguna tentang hal itu (Anda harus memformat ulang seluruh pengecualian untuk sesuatu yang berguna bagi pengguna di UI).
Pekerjaan Anda sebagai pengembang perangkat lunak adalah berusaha untuk mencegah kasus luar biasa di mana beberapa parameter atau situasi runtime dapat berakhir dengan pengecualian. Artinya, pengecualian tidak boleh dibisukan, tetapi ini harus dihindari .
Misalnya, jika Anda tahu bahwa beberapa input integer bisa datang dengan format yang tidak valid, gunakan int.TryParse
sajaint.Parse
. Ada banyak kasus di mana Anda dapat melakukan ini alih-alih hanya mengatakan "jika gagal, cukup lempar pengecualian".
Melontarkan pengecualian itu mahal.
Jika, setelah semua, pengecualian dilemparkan, alih-alih menulis pengecualian ke log setelah dilempar, salah satu praktik terbaik adalah menangkapnya di penangan pengecualian kesempatan pertama . Sebagai contoh:
- ASP.NET: Global.asax Application_Error
- Lainnya: Acara AppDomain.FirstChanceException .
Pendirian saya adalah bahwa percobaan / tangkapan lokal lebih cocok untuk menangani kasus khusus di mana Anda dapat menerjemahkan pengecualian ke kasus lain, atau ketika Anda ingin "membisukan" untuk kasus yang sangat, sangat, sangat, sangat, sangat, sangat istimewa (bug perpustakaan) melempar pengecualian yang tidak terkait yang harus dibisukan untuk menyelesaikan seluruh bug).
Untuk kasus-kasus lainnya:
- Cobalah untuk menghindari pengecualian.
- Jika ini tidak memungkinkan: penangan pengecualian kesempatan pertama.
- Atau gunakan aspek PostSharp (AOP).
Menjawab @thewhiteambit pada beberapa komentar ...
@thewhiteambit berkata:
Pengecualian bukanlah Kesalahan Fatal, mereka Pengecualian! Kadang-kadang itu bahkan bukan Kesalahan, tetapi menganggapnya Fatal-Kesalahan adalah pemahaman yang sepenuhnya salah tentang apa itu Pengecualian.
Pertama-tama, bagaimana pengecualian bahkan tidak bisa kesalahan?
- Tidak ada koneksi basis data => pengecualian.
- Format string tidak valid untuk menguraikan beberapa tipe => pengecualian
- Mencoba mem-parsing JSON dan sementara input sebenarnya bukan pengecualian JSON =>
- Argumen
null
sementara objek diharapkan => pengecualian
- Beberapa perpustakaan memiliki bug => melempar pengecualian yang tidak terduga
- Ada koneksi soket dan terputus. Kemudian Anda mencoba mengirim pesan => pengecualian
- ...
Kami mungkin mencantumkan 1k kasus ketika pengecualian dilemparkan, dan setelah semua, salah satu kasus yang mungkin akan menjadi kesalahan .
Pengecualian adalah kesalahan, karena pada akhirnya itu adalah objek yang mengumpulkan informasi diagnostik - ia memiliki pesan dan itu terjadi ketika terjadi kesalahan.
Tidak ada yang akan melempar pengecualian ketika tidak ada kasus luar biasa. Pengecualian harus memblokir kesalahan karena begitu mereka dilempar, jika Anda tidak mencoba untuk jatuh ke dalam penggunaan try / catch dan pengecualian untuk menerapkan aliran kontrol itu berarti aplikasi / layanan Anda akan menghentikan operasi yang dimasukkan ke dalam kasus luar biasa .
Juga, saya menyarankan semua orang untuk memeriksa paradigma gagal-cepat yang diterbitkan oleh Martin Fowler (dan ditulis oleh Jim Shore) . Ini adalah bagaimana saya selalu mengerti bagaimana menangani pengecualian, bahkan sebelum saya sampai pada dokumen ini beberapa waktu lalu.
[...] menganggap mereka Fatal-Kesalahan adalah pemahaman yang sepenuhnya salah tentang apa pengecualian itu.
Biasanya pengecualian memotong beberapa aliran operasi dan ditangani untuk mengubahnya menjadi kesalahan yang dapat dipahami manusia. Dengan demikian, sepertinya pengecualian sebenarnya adalah paradigma yang lebih baik untuk menangani kasus kesalahan dan bekerja pada mereka untuk menghindari crash aplikasi / layanan lengkap dan memberi tahu pengguna / konsumen bahwa ada kesalahan.
Jawaban lain tentang masalah @thewhiteambit
Misalnya dalam hal Koneksi-Database yang hilang, program dapat melanjutkan menulis ke file lokal dan mengirimkan perubahan ke Database begitu tersedia lagi. Pengecoran String-To-Number Anda yang tidak valid dapat mencoba mengurai lagi dengan interpretasi bahasa-lokal pada Pengecualian, seperti saat Anda mencoba bahasa Inggris default ke Parse ("1,5") gagal dan Anda mencobanya dengan interpretasi Jerman lagi yang sepenuhnya baik karena kita menggunakan koma bukan titik sebagai pemisah. Anda melihat Pengecualian ini bahkan tidak boleh memblokir, mereka hanya perlu beberapa penanganan Pengecualian.
Jika aplikasi Anda dapat bekerja offline tanpa menahan data ke basis data, Anda tidak boleh menggunakan pengecualian , karena menerapkan aliran kontrol try/catch
dianggap sebagai anti-pola. Pekerjaan offline adalah kasus penggunaan yang memungkinkan, jadi Anda menerapkan aliran kontrol untuk memeriksa apakah basis data dapat diakses atau tidak, Anda tidak menunggu sampai tidak terjangkau .
Hal parsing juga merupakan kasus yang diharapkan ( bukan KASUS LUAR BIASA ). Jika Anda mengharapkan ini, Anda tidak menggunakan pengecualian untuk melakukan kontrol aliran! . Anda mendapatkan beberapa metadata dari pengguna untuk mengetahui apa budayanya dan Anda menggunakan formatters untuk ini! .NET juga mendukung hal ini dan lingkungan lain, dan pengecualian karena pemformatan angka harus dihindari jika Anda mengharapkan penggunaan khusus aplikasi / layanan Anda .
Pengecualian yang tidak ditangani biasanya menjadi Kesalahan, tetapi Pengecualian itu sendiri bukan codeproject.com/Articles/15921/Not-All-Exceptions-Are-Errors
Artikel ini hanya pendapat atau sudut pandang penulis.
Karena Wikipedia bisa juga hanya pendapat penulis artikel, saya tidak akan mengatakan itu adalah dogma , tetapi periksa apa kata Coding oleh pengecualian artikel di suatu tempat dalam beberapa paragraf:
[...] Menggunakan pengecualian ini untuk menangani kesalahan spesifik yang muncul untuk melanjutkan program disebut pengkodean dengan pengecualian. Anti-pola ini dapat dengan cepat menurunkan perangkat lunak dalam kinerja dan pemeliharaan.
Ia juga mengatakan di suatu tempat:
Penggunaan pengecualian salah
Seringkali pengkodean dengan pengecualian dapat menyebabkan masalah lebih lanjut dalam perangkat lunak dengan penggunaan pengecualian yang salah. Selain menggunakan penanganan eksepsi untuk masalah unik, penggunaan eksepsi yang salah akan mengambil ini lebih jauh dengan mengeksekusi kode bahkan setelah eksepsi dinaikkan. Metode pemrograman yang buruk ini menyerupai metode goto dalam banyak bahasa perangkat lunak tetapi hanya terjadi setelah masalah dalam perangkat lunak terdeteksi.
Jujur, saya percaya bahwa perangkat lunak tidak dapat dikembangkan tidak menganggap serius kasus penggunaan. Jika Anda tahu itu ...
- Basis data Anda bisa offline ...
- Beberapa file dapat dikunci ...
- Beberapa pemformatan mungkin tidak didukung ...
- Beberapa validasi domain mungkin gagal ...
- Aplikasi Anda harus berfungsi dalam mode offline ...
- kasus penggunaan apa pun ...
... Anda tidak akan menggunakan pengecualian untuk itu . Anda akan mendukung kasus penggunaan ini menggunakan aliran kontrol biasa.
Dan jika beberapa use case yang tidak terduga tidak tercakup, kode Anda akan gagal dengan cepat, karena itu akan menimbulkan pengecualian . Benar, karena pengecualian adalah kasus luar biasa .
Di sisi lain, dan akhirnya, kadang-kadang Anda menutup kasus luar biasa dengan melempar pengecualian yang diharapkan , tetapi Anda tidak membuangnya untuk menerapkan aliran kontrol. Anda melakukannya karena Anda ingin memberi tahu lapisan atas bahwa Anda tidak mendukung beberapa use case atau kode Anda gagal bekerja dengan beberapa argumen yang diberikan atau data / properti lingkungan.