Membaca artikel Eric Lippert tentang pengecualian jelas merupakan pembuka mata tentang bagaimana saya harus mendekati pengecualian, baik sebagai produsen maupun sebagai konsumen. Namun, saya masih berjuang untuk mendefinisikan pedoman tentang bagaimana menghindari melemparkan pengecualian yang menjengkelkan.
Secara khusus:
- Misalkan Anda memiliki metode Simpan yang dapat gagal karena a) Orang lain memodifikasi catatan sebelum Anda , atau b) Nilai yang Anda coba buat sudah ada . Kondisi ini diharapkan dan tidak luar biasa, jadi alih-alih melemparkan pengecualian Anda memutuskan untuk membuat versi Coba dari metode Anda, TrySave, yang mengembalikan boolean yang menunjukkan jika penyelamatan berhasil. Tetapi jika gagal, bagaimana konsumen tahu apa masalahnya? Atau akan lebih baik untuk mengembalikan enum yang menunjukkan hasil, seperti Ok / RecordAlreadyModified / ValueAlreadyExists? Dengan integer.TryParse masalah ini tidak ada, karena hanya ada satu alasan metode ini dapat gagal.
- Apakah contoh sebelumnya benar-benar situasi yang menjengkelkan? Atau akankah melemparkan pengecualian dalam kasus ini menjadi cara yang disukai? Saya tahu itulah yang dilakukan di sebagian besar perpustakaan dan kerangka kerja, termasuk kerangka kerja Entity.
- Bagaimana Anda memutuskan kapan akan membuat versi Coba dari metode Anda vs. menyediakan beberapa cara untuk menguji sebelumnya apakah metode itu akan berfungsi atau tidak? Saat ini saya mengikuti pedoman ini:
- Jika ada kemungkinan kondisi balapan, maka buat versi Coba. Ini mencegah kebutuhan konsumen untuk menangkap pengecualian eksogen. Misalnya, dalam metode Simpan yang dijelaskan sebelumnya.
- Jika metode untuk menguji kondisi cukup banyak akan melakukan semua yang metode asli lakukan, maka buat versi Coba. Misalnya, integer.TryParse ().
- Dalam kasus lain, buat metode untuk menguji kondisi.