Apakah praktik yang baik untuk menggunakan pengecualian dan melempar / menangkap pengecualian daripada mengembalikan 0 atau 1 dari fungsi dan kemudian menggunakan if / else untuk menangani kesalahan. Dengan demikian, membuatnya lebih mudah untuk memberi tahu pengguna tentang masalah tersebut.
Tidak tidak Tidak!
Jangan gabungkan pengecualian dan kesalahan. Pengecualian, yah, luar biasa. Kesalahan tidak. Saat Anda meminta pengguna untuk memasukkan jumlah produk, dan pengguna memasukkan "halo", itu adalah kesalahan. Ini bukan pengecualian: tidak ada yang luar biasa dalam melihat input yang tidak valid dari pengguna. Mengapa Anda tidak dapat menggunakan pengecualian dalam kasus yang tidak biasa, seperti saat memvalidasi input? Orang lain sudah menjelaskannya, dan menunjukkan alternatif valid untuk input validasi.
Ini juga berarti bahwa pengguna tidak peduli tentang pengecualian Anda , dan menunjukkan pengecualian itu tidak ramah dan berbahaya . Misalnya, pengecualian selama eksekusi query SQL sering mengungkapkan query itu sendiri. Yakin ingin mengambil risiko untuk menampilkan pesan seperti itu kepada semua orang?
lebih dari 1 hal bisa salah, seperti masalah basis data, entri duplikat, masalah server, dll. Ketika masalah terjadi saat pendaftaran, pengguna harus mengetahuinya.
Salah. Sebagai pengguna, saya tidak perlu tahu masalah basis data Anda, entri rangkap, dll. Saya benar-benar tidak peduli dengan masalah Anda . Apa yang saya lakukan perlu tahu adalah bahwa saya masuk username yang sudah ada. Seperti yang sudah dikatakan, input yang salah dari saya harus memicu kesalahan, bukan pengecualian.
Bagaimana cara menghasilkan kesalahan itu? Itu tergantung pada konteksnya. Untuk nama pengguna yang sudah digunakan, saya ingin melihat bendera merah kecil muncul di dekat nama pengguna, bahkan sebelum mengirimkan formulir, mengatakan bahwa nama pengguna sudah digunakan. Tanpa JavaScript, bendera yang sama harus muncul setelah pengiriman.
Untuk kesalahan lain, Anda akan menampilkan satu halaman penuh dengan kesalahan, atau memilih cara lain untuk memberi tahu pengguna bahwa ada kesalahan (misalnya pesan yang akan muncul, kemudian menghilang di bagian atas halaman). Pertanyaannya kemudian lebih terkait dengan pengalaman pengguna daripada pemrograman.
Dari sudut pandang programmer, tergantung dari jenis kesalahan, Anda akan menyebarkannya dengan cara yang berbeda. Misalnya, dalam kasus nama pengguna sudah diambil, permintaan AJAX untuk http://example.com/?ajax=1&user-exists=John
akan mengembalikan objek JSON yang menunjukkan:
- Bahwa pengguna sudah ada,
- Pesan kesalahan ditampilkan kepada pengguna.
Poin kedua penting: Anda ingin memastikan bahwa pesan yang sama muncul baik ketika mengirimkan formulir dengan JavaScript dinonaktifkan dan mengetik nama pengguna duplikat dengan JavaScript diaktifkan. Anda tidak ingin menduplikasi teks pesan kesalahan dalam kode sumber sisi server dan dalam JavaScript!
Ini sebenarnya teknik yang digunakan oleh situs web Stack Exhange. Sebagai contoh jika saya mencoba untuk memvotasikan jawaban saya sendiri, respons AJAX berisi kesalahan untuk ditampilkan:
{"Success":false,"Warning":false,"NewScore":0,"Message":"You can't vote for your own post.",
"Refresh":false}
Anda juga dapat memilih pendekatan lain, dan mempraset kesalahan di halaman HTML sebelum formulir diisi. Pro: Anda tidak perlu mengirim pesan kesalahan dalam respons AJAX. Cons: bagaimana dengan aksesibilitas? Cobalah menelusuri halaman tanpa CSS, dan Anda akan melihat semua kesalahan yang mungkin muncul.
Ya ya ya!
Jika Anda ingin memiliki kode bersih, Anda harus hampir secara eksklusif menggunakan pengecualian dan jangan repot-repot menggunakan kode kesalahan. Kode kesalahan tidak ada artinya. Mereka hampir selalu terikat pada konstanta numerik yang tidak mengungkapkan banyak informasi. Ini dapat membuat kode Anda tidak dapat dibaca dan mereka akan membuatnya sulit untuk menyebarkan data di samping kesalahan.
Namun, pengecualian adalah kelas dan dapat berisi informasi apa pun yang Anda suka. Jadi pengguna memasukkan input yang salah, seperti 'abc' untuk bidang angka. Dengan kode kesalahan Anda tidak akan dapat menyebarkan informasi ini ke penangan kesalahan tanpa banyak gelembung. Sesuatu yang disediakan pengecualian gratis. Selain itu, pengecualian memungkinkan Anda untuk memiliki nilai balik yang bermakna dalam fungsi dan metode sambil tetap memiliki cara gagal secara elegan. Bahkan lebih baik lagi, Pengecualian disebarkan ke tempat Anda ingin menanganinya! Bayangkan jumlah kode spageti yang Anda perlukan untuk menyebarkan kode kesalahan dengan data yang bermakna ke penangan satu atau dua lapisan di atas.
Juga, pengecualian menyatakan jauh lebih semantik daripada kode kesalahan. Kode kesalahan mengarah ke kode spaghetti di mana penanganan pengecualian mengarah ke kode bersih.
Selain itu, mudah untuk lupa memeriksa kode status. Dalam bahasa seperti Java Anda terpaksa menangani pengecualian (sesuatu yang misalnya C # misses).
Gunakan pengecualian dan tangani di pengontrol Anda.
sumber
Pertimbangkan kelas kecil yang berguna ini:
Itu penggunaan pengecualian yang sangat bagus. Dari
FunkyFile's
perspektif sama sekali tidak ada yang dapat dilakukan untuk memperbaiki situasi jika salah jalan tidak valid ataufile_get_contents
gagal. Situasi yang benar-benar luar biasa;)Tetapi apakah ada nilai bagi pengguna Anda untuk mengetahui bahwa Anda menemukan jalur file yang salah, di suatu tempat dalam kode Anda? Sebagai contoh:
Selain memberi tahu orang-orang bahwa Anda mengalami hari yang buruk, pilihan Anda adalah:
Fallback
Apakah Anda punya cara lain untuk mendapatkan informasi? Dalam contoh sederhana saya di atas, sepertinya tidak mungkin, tetapi pertimbangkan skema master / slave database. Master mungkin gagal merespons tetapi mungkin, mungkin saja, budak masih di luar sana (atau sebaliknya).
Apakah ini kesalahan pengguna?
Apakah pengguna mengirimkan input yang salah? Nah, katakan padanya tentang itu. Anda bisa menggonggong pesan kesalahan, atau bersikap baik dan menemani pesan kesalahan itu dengan formulir sehingga dia bisa mengetik di jalur yang benar.
Apakah ini salahmu?
Dan oleh Anda, maksud saya apa pun yang bukan pengguna, sehingga berkisar dari Anda mengetik jalur file yang salah, untuk sesuatu yang serba salah di server Anda. Sebenarnya, sudah waktunya untuk kesalahan HTTP 503 , karena, juga, layanan tidak tersedia. CI memiliki
show_404()
fungsi, Anda dapat dengan mudah membangunshow_503()
.Kata nasihat, Anda harus mempertimbangkan pengecualian nakal. CodeIgniter adalah sepotong kode yang berantakan, dan Anda tidak pernah tahu kapan pengecualian akan muncul. Demikian pula, Anda mungkin lupa tentang pengecualian Anda sendiri, dan opsi teraman adalah menerapkan tangkapan semua penangan pengecualian. Di PHP Anda bisa melakukannya dengan set_exception_handler :
Dan Anda juga bisa mengatasi kesalahan jahat, melalui set_error_handler . Anda bisa menulis handler yang sama dengan pengecualian, atau sebagai alternatif mengonversi semua kesalahan ke
ErrorException
dan membiarkan penanganan handler pengecualian Anda dengan mereka:sumber