Gunakan pengecualian untuk hal-hal luar biasa, hal-hal yang tidak dapat Anda harapkan terlalu sering terjadi, hal-hal yang mengindikasikan bahwa ada yang tidak beres. Misalnya, jika jaringan mati, itu adalah hal yang luar biasa untuk server web. Jika database tidak tersedia, itu berarti ada sesuatu yang salah. Jika file konfigurasi tidak ada, itu mungkin berarti pengguna mengacaukannya.
Jangan gunakan pengecualian untuk menangani kode yang salah. Untuk memeriksa kebenaran kode, Anda harus menggunakan asersi, atau, dalam .NET Framework 4 dan yang lebih baru, kontrak Kode (yang menggantikan asersi dan memiliki fitur tambahan, terutama yang berharga).
Jangan gunakan pengecualian dalam kasus yang tidak biasa. Fakta bahwa pengguna, ketika diminta untuk memasukkan nomor, memasukkan "anjing" tidak begitu luar biasa untuk mendapatkan pengecualian.
Hati-hati saat memilih jenis pengecualian. Buat jenis Anda sendiri saat dibutuhkan. Hati-hati memilih warisan, dengan mengingat bahwa menangkap orang tua juga akan menangkap anak-anak. Tidak pernah throw Exception
.
Jangan gunakan kode pengembalian untuk kesalahan. Kode kesalahan mudah ditutup, diabaikan, dilupakan. Jika ada kesalahan, peganglah, atau sebarkan ke tumpukan atas.
Dalam kasus di mana suatu metode diharapkan untuk mengembalikan kesalahan dan kesalahan itu tidak luar biasa, gunakan enums, jangan pernah nomor kesalahan. Contoh:
// Note that the operation fails pretty often, since it deals with the servers which are
// frequently unavailable, and the ones which send garbage instead of the actual data.
private LoadOperationResult LoadProductsFromWeb()
{
...
}
Arti dari LoadOperationResult.ServerUnavailable
,, LoadOperationResult.ParsingError
dll. Jauh lebih eksplisit daripada, katakanlah, mengingat bahwa kode 12 berarti bahwa server sedang down, dan kode 13 - bahwa data tidak dapat diuraikan.
Gunakan kode kesalahan saat merujuk pada yang umum, yang diketahui oleh setiap pengembang yang bekerja di domain tertentu. Misalnya, jangan menemukan kembali nilai enum untuk HTTP 404 Not Found atau HTTP 500 Internal Server Error.
Waspadalah terhadap booleans. Cepat atau lambat, Anda akan ingin tahu tidak hanya apakah metode tertentu berhasil atau gagal, tetapi mengapa. Pengecualian dan enum jauh lebih kuat untuk itu.
Jangan menangkap setiap pengecualian (kecuali Anda berada di bagian paling atas tumpukan). Jika Anda menangkap pengecualian, Anda harus siap menanganinya. Menangkap semuanya menunjukkan bahwa Anda tidak peduli jika kode Anda berjalan dengan benar. Ini mungkin memecahkan "Saya tidak ingin mencari sekarang bagaimana cara memperbaikinya", tetapi akan menyakiti Anda cepat atau lambat.
Dalam C #, jangan pernah ubah kembali pengecualian seperti ini:
catch (SomeException ex)
{
...
throw ex;
}
karena Anda melanggar tumpukan. Lakukan ini sebagai gantinya:
catch (SomeException)
{
...
throw;
}
Usahakan saat menulis pesan pengecualian. Berapa kali saya melihat sesuatu seperti throw Exception("wrong data")
atau throw Exception("shouldn't call this method in this context")
. Pengembang lain, termasuk Anda sendiri enam bulan kemudian, tidak akan tahu data apa yang salah dan mengapa atau mengapa kita tidak memanggil beberapa metode dalam suatu konteks, atau konteks mana yang tepat.
Jangan tampilkan pesan pengecualian kepada pengguna. Mereka tidak diharapkan untuk orang-orang biasa, dan sering bahkan tidak dapat dibaca untuk pengembang sendiri.
Jangan melokalkan pesan pengecualian. Mencari dokumentasi untuk pesan lokal sangat melelahkan dan tidak ada gunanya: setiap pesan harus hanya dalam Bahasa Inggris dan Bahasa Inggris.
Jangan fokus secara eksklusif pada pengecualian dan kesalahan: log juga sangat penting.
Dalam .NET, jangan lupa untuk memasukkan pengecualian dalam dokumentasi XML metode ini:
/// <exception cref="MyException">Description of the exception</exception>
Menyertakan pengecualian dalam dokumentasi XML membuat segalanya lebih mudah bagi orang yang menggunakan perpustakaan. Tidak ada yang lebih menyebalkan daripada mencoba menebak pengecualian mana yang bisa dilemparkan dengan metode dan alasannya.
Dalam hal ini¹, penanganan pengecualian Java menyediakan pendekatan yang lebih ketat dan lebih baik. Ini memaksa Anda untuk berurusan dengan pengecualian yang berpotensi dilemparkan oleh metode yang disebut, atau menyatakan dengan metode Anda sendiri bahwa itu dapat membuang pengecualian yang tidak Anda tangani, membuat hal-hal menjadi sangat transparan.