Saya tetap sederhana.
Pustaka memiliki tipe pengecualian dasar yang diperluas dari std ::: runtime_error (yang berasal dari C ++ berlaku sesuai dengan bahasa lain). Pengecualian ini membutuhkan string pesan sehingga kami dapat login; setiap titik lemparan memiliki pesan unik (biasanya dengan ID unik).
Itu saja.
Catatan 1 : Dalam situasi di mana seseorang menangkap pengecualian dapat memperbaiki pengecualian dan memulai kembali tindakan. Saya akan menambahkan pengecualian turunan untuk hal-hal yang berpotensi diperbaiki secara unik di lokasi terpencil. Tapi ini sangat jarang (Ingat penangkap tidak mungkin dekat dengan titik lemparan sehingga memperbaiki masalah akan sulit (tetapi semuanya tergantung pada situasi)).
Catatan 2 : Terkadang perpustakaan sangat sederhana sehingga tidak layak untuk memberikan pengecualiannya sendiri dan std :: runtime_error akan melakukannya. Hanya penting untuk memiliki pengecualian jika kemampuan untuk membedakannya dari std :: runtime_error dapat memberikan informasi yang cukup kepada pengguna untuk melakukan sesuatu dengannya.
Catatan 3 : Dalam suatu kelas saya biasanya lebih suka kode kesalahan (tetapi ini tidak akan pernah keluar di API publik kelas saya).
Melihat trade off Anda:
Pertukaran yang saya lihat meliputi:
Kelas pengecualian lainnya dapat memungkinkan tingkat penanganan kesalahan yang sangat baik untuk pengguna API (cenderung konfigurasi pengguna atau kesalahan data, atau file tidak ditemukan)
Apakah lebih banyak pengecualian benar-benar memberi Anda kendali butir yang lebih baik? Pertanyaannya menjadi dapatkah kode penangkapan benar-benar memperbaiki kesalahan berdasarkan pengecualian. Saya yakin ada situasi seperti itu dan dalam kasus ini Anda harus memiliki pengecualian lain. Tetapi semua pengecualian yang telah Anda sebutkan di atas satu-satunya koreksi yang berguna adalah menghasilkan peringatan besar dan menghentikan aplikasi.
Kelas pengecualian lainnya memungkinkan informasi spesifik kesalahan untuk dimasukkan dalam pengecualian, bukan hanya pesan string atau kode kesalahan
Ini adalah alasan bagus untuk menggunakan pengecualian. Tetapi informasi tersebut harus bermanfaat bagi orang yang menyimpannya. Bisakah mereka menggunakan informasi untuk melakukan beberapa tindakan korektif? Jika objek bersifat internal ke pustaka Anda dan tidak dapat digunakan untuk mempengaruhi API apa pun maka informasi tersebut tidak berguna. Anda harus sangat spesifik bahwa informasi yang dilemparkan memiliki nilai berguna bagi orang yang dapat menangkapnya. Orang yang menangkapnya biasanya berada di luar API publik Anda, jadi sesuaikan informasi Anda sehingga dapat digunakan dengan hal-hal di API publik Anda.
Jika yang bisa mereka lakukan hanyalah mencatat pengecualian maka yang terbaik adalah hanya membuang pesan kesalahan daripada banyak data. Sebagai penangkap biasanya akan membangun pesan kesalahan dengan data. Jika Anda membuat pesan kesalahan maka itu akan konsisten di semua penangkap, jika Anda mengizinkan penangkap untuk membangun pesan kesalahan Anda bisa mendapatkan kesalahan yang sama dilaporkan secara berbeda tergantung pada siapa yang memanggil dan menangkap.
Perkecualian lebih sedikit, tetapi menyematkan kode kesalahan yang dapat digunakan sebagai pencarian
Anda harus menentukan cuaca kode kesalahan dapat digunakan secara bermakna. Jika bisa maka Anda harus memiliki pengecualian sendiri. Jika tidak, pengguna Anda sekarang perlu menerapkan pernyataan switch di dalam tangkapan (yang mengalahkan seluruh titik menangkap secara otomatis menangani hal-hal).
Jika tidak bisa maka mengapa tidak menggunakan pesan kesalahan dalam pengecualian (tidak perlu membagi kode dan pesan itu membuat sulit untuk melihat ke atas).
Mengembalikan kode kesalahan dan menandai langsung dari fungsi (terkadang tidak dimungkinkan dari utas)
Mengembalikan kode kesalahan sangat bagus secara internal. Ini memungkinkan Anda untuk memperbaiki bug di sana dan kemudian dan Anda harus memastikan Anda memperbaiki semua kode kesalahan dan akun untuk mereka. Tapi membocorkannya di API publik Anda adalah ide yang buruk. Masalahnya adalah bahwa pemrogram sering lupa memeriksa status kesalahan (setidaknya dengan pengecualian kesalahan yang tidak dicentang akan memaksa aplikasi untuk keluar dari kesalahan yang tidak ditangani umumnya akan merusak semua data Anda).
Menerapkan suatu peristiwa atau sistem panggilan balik jika terjadi kesalahan (menghindari tumpukan yang tidak berujung)
Metode ini sering digunakan bersama dengan mekanisme penanganan kesalahan lainnya (bukan sebagai alternatif). Pikirkan program windows Anda. Pengguna memulai tindakan dengan memilih item menu. Ini menghasilkan tindakan pada antrian acara. Antrian acara akhirnya memberikan utas untuk menangani tindakan. Thread seharusnya menangani aksi dan akhirnya kembali ke thread pool dan menunggu tugas lain. Di sini pengecualian harus ditangkap di pangkalan oleh utas yang ditugaskan untuk pekerjaan itu. Hasil menangkap pengecualian biasanya akan menghasilkan acara yang dibuat untuk loop utama yang akhirnya akan menghasilkan pesan kesalahan yang ditampilkan kepada pengguna.
Tetapi kecuali Anda dapat melanjutkan menghadapi pengecualian, tumpukan akan terlepas (setidaknya untuk utas).