Pada pertanyaan SO, saya bertanya di sini tentang beberapa kode yang saya tidak yakin, seseorang menjawab "BTW, kode mengerikan di sana: ia menggunakan simbol penekan kesalahan (@) banyak."
Apakah ada alasan mengapa ini merupakan praktik yang buruk? Dengan hal-hal seperti:
$db=@new mysqli($db_info) or die('Database error');
, itu memungkinkan saya untuk menampilkan hanya pesan kesalahan khusus. Tanpa penindasan kesalahan, maka masih akan menampilkan pesan PHP khas:
Peringatan : mysqli :: mysqli (): php_network_getaddresses: getaddrinfo gagal: Tidak ada host yang dikenal. di beberapa \ file \ path pada baris 6
serta 'Kesalahan basis data'.
Apakah penindasan kesalahan selalu buruk, dan jika demikian, apa yang khususnya tentang hal di atas yang buruk?
Perbarui: kode aktual yang saya gunakan adalah:
or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b><br />Error occurred on line <b>' . __LINE__ . '</b> of <b>' . __FILE__ . '</b>' : ''))
yang menghapus semua output sebelumnya dan menampilkan pesan kesalahan. Jadi fakta bahwa pesan kesalahan tidak termasuk rincian tentang apa yang terjadi secara spesifik (yang orang tampaknya sarankan sebagai alasan mengapa penindasan kesalahan buruk) tidak relevan.
sumber
or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b>' : ''))
Jawaban:
Saya pikir Anda melakukan hal yang benar dengan menekan kesalahan, karena Anda menerapkan penanganan kesalahan Anda sendiri.
Mungkin lebih mudah untuk mempertimbangkan padanan dalam, katakanlah, Java. Menekan kesalahan menggunakan
@
analog dengan menelan pengecualian. Kode berikut, yang mirip dengan Anda, masuk akal:(Ya, di Jawa, Anda tidak ingin mesin servlet mati, tetapi Anda mendapatkan idenya.)
Namun, ini tidak dapat diterima:
Kebanyakan penindasan kesalahan PHP dilakukan secara sembarangan, analog dengan contoh terakhir, karenanya reaksi spontan terhadap kode Anda.
sumber
Penindasan kesalahan buruk, karena tidak hanya menyembunyikan informasi yang sudah Anda ketahui ( ada yang salah). Mungkin juga menyembunyikan informasi penting untuk debugging yang tidak Anda sadari ( apa , di mana dan mengapa ).
Dalam contoh khusus ini, " Kesalahan basis data " bukan pesan kesalahan yang sangat baik. Ada yang salah dengan DB. Tidak terlalu mencerahkan. " Peringatan: mysqli :: mysqli (): php_network_getaddresses: getaddrinfo gagal: Tidak ada host yang dikenal. di beberapa \ file \ path on line 6 "sebenarnya adalah pesan kesalahan yang lebih baik. Ini memberi Anda lokasi dan alasan untuk masalah tersebut. Anda dapat langsung masuk dan mulai men-debug, karena kesalahan sudah ditemukan.
Tentu saja, perancang perpustakaan terkadang memiliki kecenderungan untuk memunculkan banyak peringatan yang tidak relevan. Saya tidak tahu PHP cukup baik untuk mengetahui apakah ia memiliki cara untuk menyaring peringatan yang Anda tidak tertarik. Saya tahu bahwa membaca stacktrace seratus baris tidak terlalu mencerahkan. Tetapi respons yang benar terhadap terlalu banyak informasi bukanlah untuk mengurangi jumlah informasi menjadi nol , tetapi untuk menyaring bagian yang tidak relevan pada tahap tertentu. The
@
operator tidak memiliki rincian ini (moto itu adalah semua atau tidak ), dan karena itu bukan merupakan alat yang cocok untuk manajemen kesalahan yang efektif.Ada beberapa kasus di mana Anda tahu bahwa kesalahan tertentu akan muncul, dan bahwa memperbaiki masalah sebenarnya lebih mahal daripada membungkam pesan (dan berpotensi mengalami kejatuhan karena itu). Ini bisa menjadi kasus dalam skrip satu kali, tetapi menempelkan jari Anda ke telinga Anda dan pergi " la la la " bukan respons profesional terhadap bug (potensial).
sumber
die
tidak cocok untuk keduanya. Dan informasi terperinci harus masuk ke log terlepas dari apa yang Anda tunjukkan kepada pengguna .display_errors
off,log_errors
on, dan Anda cukup baik untuk pergi, lakukan sesuka Anda pada mendeteksi kesalahan, tetapi jangan membuangnya.Kesalahan penekan buruk karena menyembunyikan masalah, yang sering kali tidak kita sadari dan dapat mengakibatkan perilaku tak terduga yang mungkin terbukti sangat mahal dalam beberapa aplikasi penting misalnya dalam aplikasi yang digunakan dalam bidang keuangan, kesehatan, dan pertahanan.
Ini juga bukan ide yang baik untuk memiliki pengecualian yang tidak tertangani dalam kode dan menunjukkan pesan kesalahan yang sebenarnya kepada pengguna karena dapat mengakibatkan masalah keamanan karena pesan kesalahan biasanya mengungkapkan banyak tentang kode Anda, yang dapat membantu pengguna jahat dan peretas untuk memanipulasi sistem.
Jadi praktik yang baik adalah menangani kesalahan pada tingkat yang berbeda, misalnya pada tingkat tertinggi Anda dapat menangani kesalahan hanya dengan masuk kesalahan aktual dan menampilkan pesan yang sederhana dan ramah pengguna kepada pengguna.
sumber
Ya, operator penekan kesalahan umumnya adalah ide yang buruk.
Anda harus mengelola pelaporan kesalahan dalam konfigurasi (
php.ini
). Jadi, Anda dapat memilih pengaturan yang berbeda untuk setiap lingkungan (misalnya, cuti peringatan dalam pengembangan dan menyembunyikannya dalam produksi).Satu-satunya situasi ketika menggunakan
@
bisa masuk akal adalah ketika Anda mengembangkan perpustakaan untuk pengembang lain. Jika Anda secara sukarela memilih untuk melakukan sesuatu yang menghasilkan peringatan, dan tidak ingin mengganggu pengguna perpustakaan Anda dengan peringatan yang tidak bergantung pada mereka,@
bisa menjadi solusi.Saya tidak bisa memikirkan penggunaan lainnya.
sumber