Ada banyak persyaratan yang dibutuhkan suatu sistem untuk menyampaikan dan menangani pengecualian dengan benar. Ada juga banyak pilihan untuk dipilih suatu bahasa untuk mengimplementasikan konsep tersebut.
Persyaratan untuk pengecualian (tanpa urutan tertentu):
Dokumentasi : Suatu bahasa harus memiliki maksud untuk mendokumentasikan pengecualian yang dapat dilemparkan API. Idealnya media dokumentasi ini dapat digunakan mesin untuk memungkinkan kompiler dan IDE untuk memberikan dukungan kepada programmer.
Mentransmisikan Situasi Luar Biasa : Yang ini jelas, untuk memungkinkan suatu fungsi menyampaikan situasi yang mencegah fungsi yang disebut melakukan tindakan yang diharapkan. Menurut pendapat saya ada tiga kategori besar dari situasi seperti ini:
2.1 Bug dalam kode yang menyebabkan beberapa data menjadi tidak valid.
2.2 Masalah dalam konfigurasi atau sumber daya eksternal lainnya.
2.3 Sumber daya yang secara inheren tidak dapat diandalkan (jaringan, sistem file, database, pengguna akhir dll). Ini adalah sedikit kasus sudut karena sifat tidak dapat diandalkan kita harus mengharapkan kegagalan sporadis mereka. Dalam hal ini apakah situasi ini dianggap luar biasa?
Berikan informasi yang cukup untuk kode untuk menanganinya : Pengecualian harus memberikan informasi yang cukup kepada callee sehingga dapat bereaksi dan mungkin menangani situasi. informasi juga harus memadai sehingga ketika dicatat pengecualian ini akan memberikan konteks yang cukup bagi seorang programmer untuk mengidentifikasi dan mengisolasi pernyataan yang menyinggung dan memberikan solusi.
Berikan kepercayaan kepada programmer tentang status saat ini dari status eksekusi kode-nya : Pengecualian kemampuan penanganan sistem perangkat lunak harus ada cukup untuk memberikan perlindungan yang diperlukan sambil tetap berada di luar jalan programmer sehingga ia bisa tetap fokus pada tugas di tangan.
Untuk mengatasinya, metode berikut diimplementasikan dalam berbagai bahasa:
Pengecualian yang Diperiksa Menyediakan cara yang bagus untuk mendokumentasikan pengecualian, dan secara teoritis bila diterapkan dengan benar harus memberikan jaminan yang cukup bahwa semuanya baik. Namun biayanya sedemikian rupa sehingga banyak yang merasa lebih produktif untuk mem-bypass baik dengan menelan pengecualian atau melemparkannya kembali sebagai pengecualian yang tidak diperiksa. Ketika digunakan pengecualian diperiksa tidak tepat cukup banyak kehilangan semua manfaatnya. Selain itu, pengecualian yang diperiksa membuat sulit untuk membuat API yang stabil dalam waktu. Implementasi sistem generik dalam domain tertentu akan membawa beban situasi luar biasa yang akan sulit dipertahankan dengan menggunakan pengecualian yang hanya diperiksa.
Pengecualian yang Tidak Dicentang - jauh lebih fleksibel daripada pengecualian yang diperiksa, mereka gagal mendokumentasikan situasi luar biasa yang mungkin terjadi dari implementasi yang diberikan. Mereka mengandalkan dokumentasi ad-hoc jika sama sekali. Ini menciptakan situasi di mana sifat media yang tidak dapat diandalkan ditutupi oleh API yang memberikan tampilan keandalan. Juga ketika dilontarkan pengecualian ini kehilangan artinya ketika bergerak kembali melalui lapisan abstraksi. Karena mereka didokumentasikan dengan buruk, seorang programmer tidak dapat menargetkan mereka secara khusus dan seringkali perlu menggunakan jaringan yang lebih luas daripada yang diperlukan untuk memastikan bahwa sistem sekunder, jika mereka gagal, jangan menjatuhkan seluruh sistem. Yang membawa kita kembali ke masalah menelan pengecualian yang disediakan.
Multistate return types Ini dia bergantung pada set disjoint, tuple, atau konsep serupa lainnya untuk mengembalikan hasil yang diharapkan atau objek yang mewakili pengecualian. Di sini tidak ada tumpukan yang dibuka, tidak ada pemotongan kode, semuanya dijalankan secara normal tetapi nilai kembali harus divalidasi untuk kesalahan sebelum melanjutkan. Saya belum benar-benar bekerja dengan ini, jadi saya tidak bisa berkomentar dari pengalaman. Saya mengakuinya menyelesaikan beberapa masalah pengecualian dengan melewati aliran normal tapi tetap saja akan menderita banyak masalah yang sama seperti pengecualian diperiksa sebagai melelahkan dan terus-menerus "di wajah Anda".
Jadi pertanyaannya adalah:
Apa pengalaman Anda dalam hal ini dan apa, menurut Anda adalah kandidat terbaik untuk membuat sistem penanganan perkecualian yang baik untuk sebuah bahasa?
EDIT: Beberapa menit setelah menulis pertanyaan ini saya menemukan posting ini , seram!
noexcept
cerita di C ++ dapat menghasilkan wawasan yang sangat baik untuk EH di C # dan Java juga.)