Meskipun saya sudah memprogram pada level profesional selama beberapa tahun, saya masih belum sepenuhnya memahami penanganan kesalahan. Meskipun aplikasi saya berfungsi dengan baik, penanganan kesalahan tidak diterapkan pada tingkat profesional dan merupakan campuran dan kecocokan dari sejumlah teknik.
Tidak ada struktur di belakang penanganan kesalahan saya. Saya ingin belajar dan memahami bagaimana penerapannya di tingkat profesional. Ini adalah satu area di mana saya kurang pengetahuan.
Kapan saya harus menggunakan pengecualian dan kapan saya harus mengembalikan status keberhasilan, untuk diperiksa dalam aliran logika? Apakah boleh mencampur pengecualian dan mengembalikan status?
Saya kode dalam C # terutama.
c#
.net
coding-standards
error-handling
James Jeffery
sumber
sumber
Jawaban:
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:
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:
karena Anda melanggar tumpukan. Lakukan ini sebagai gantinya:
Usahakan saat menulis pesan pengecualian. Berapa kali saya melihat sesuatu seperti
throw Exception("wrong data")
atauthrow 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:
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.
¹ Dikatakan demikian, saya menemukan perbedaan antara pengecualian dan kesalahan di Jawa tidak berguna dan membingungkan, mengingat bahasanya telah memeriksa dan menghapus pengecualian. Untungnya, .NET Framework hanya memiliki pengecualian, dan tidak ada kesalahan.
sumber
Saya pikir daftar MainMa sangat lengkap. Saya hanya akan menambahkan beberapa milik saya sendiri:
Alih-alih lakukan ini:
Jangan gunakan pengecualian untuk aliran kontrol. Misalnya, jangan melempar ClientNotFoundException dalam dialog pencarian (klien yang tidak ditemukan tidak biasa dalam situasi ini) dan mengharapkan kode panggilan untuk menampilkan pesan "Tidak ditemukan hasil" ketika ini terjadi.
Jangan menelan pengecualian!
Perlu diingat bahwa benar-benar menangani pengecualian hanya dapat berarti 3 hal:
Jika tidak ada opsi ini yang berlaku maka Anda mungkin tidak harus menangkap pengecualian itu. Anda harus mencatatnya, kemudian membatalkan operasi atau mematikannya. Tentu saja ini tergantung apa persyaratan Anda dalam hal ketepatan vs ketangguhan.
sumber