Rumah >pembangunan bahagian belakang >tutorial php >phpmaster | Pengendalian ralat di PHP
Kesilapan adalah peristiwa yang paling biasa yang dihadapi oleh pemaju ketika pengaturcaraan. Kesilapan boleh dikategorikan sebagai sintaks, jangka masa, atau logik: Hilang titik koma pada akhir pernyataan adalah contoh ralat sintaks; Cuba untuk menyambung ke pangkalan data apabila pelayan turun adalah contoh ralat jangka masa; Menyediakan data yang salah kepada pembolehubah adalah contoh ralat logik. Untuk membantu mengurangkan bilangan kesilapan dalam kod anda, dan untuk mengurangkan kesannya, pengendalian ralat yang betul adalah penting dalam aplikasi web anda.
Artikel ini adalah kursus kemalangan dalam pengendalian ralat PHP. Anda akan belajar tentang tahap pelaporan ralat terbina dalam PHP, dan bagaimana menangani kesilapan dengan pengendali ralat tersuai dan pengendalian pengecualian.
Tahap boleh disokong bersama-sama dengan bit-operator untuk memasukkan atau menolaknya dari konfigurasi PHP. Sebagai contoh, e_all | e_strict membolehkan semua kesilapan dan amaran dengan penambahan e_strict (perlu dalam versi PHP sebelum 5.4).
PHP menyediakan beberapa arahan konfigurasi yang berkaitan dengan pembalakan dan memaparkan kesilapan. Nilai mereka umumnya berbeza bergantung kepada sama ada sistem dalam pembangunan atau persekitaran pengeluaran. Jadual ini menunjukkan beberapa arahan yang berkaitan dengan kesilapan.
<span><span><?php </span></span><span><span>$test = 5; </span></span><span><span>if ($test > 1) { </span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE); </span></span><span><span>}</span></span>Kesalahan yang mencetuskan dengan trigger_error () berguna apabila anda mempunyai infrastruktur pengendalian kesilapan di tempat, membolehkan anda menyatukan pengendalian kesilapan tersuai dan kesilapan dan amaran yang dibangkitkan oleh PHP. Jika anda ingin melaksanakan strategi pengendalian ralat tersuai seperti menghantar e -mel atau ralat pembalakan ke pangkalan data berdasarkan keparahan mereka, maka anda perlu menentukan pengendali ralat tersuai menggunakan set_error_handler (). Fungsi ini menerima dua argumen: fungsi panggil balik atau kaedah statik yang akan digunakan apabila ralat dibangkitkan, dan secara pilihannya tahap ralat fungsi/kaedah mengendalikan. Tandatangan panggilan balik adalah:
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
Mari kita lihat fungsi pengendali ralat tersuai. Contoh di bawah merekodkan kesilapan ke pangkalan data jadual pangkalan data apabila seseorang ditemui:
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
Coretan di atas mendaftarkan pengendali ralat yang melakukan yang berikut: Apabila kesilapan tidak maut berlaku, rekod akan dimasukkan ke dalam pangkalan data dan bukannya memaparkan ralat dan log masuk ke fail; Apabila ralat maut berlaku, ia akan dilog masuk dalam pangkalan data dan menamatkan skrip anda.
Walau bagaimanapun, terdapat beberapa batasan untuk pengendali ralat tersuai yang perlu anda ketahui. Pengendali ralat memintas tingkah laku pengendalian ralat piawai PHP, jadi ia tidak dapat mengendalikan kesilapan yang mungkin timbul di dalam pengendali anda sendiri. Sekiranya pelayan pangkalan data turun, contohnya, fungsi di atas akan gagal merakam log. Selain itu, pengendali ralat tidak dapat menangkap kesilapan dalaman tertentu, seperti E_CORE_ERROR dan E_COMPILE_ERROR, atau kesilapan E_Strict dalam fail yang sama pengendali ditakrifkan kerana kesilapan tersebut berlaku sebelum pengendali mempunyai peluang untuk didaftarkan.
mengendalikan ralat menggunakan pengecualian
Walau bagaimanapun, rangka kerja pengendalian ralat yang anda ada di tempat, akan selalu ada masalah pada masa lari. Sudah tentu anda tidak mahu kesilapan ini muncul dalam penyemak imbas pengguna. Di sinilah pengendalian pengecualian memasuki gambar. Pengecualian membolehkan anda mengendalikan kesilapan dan situasi yang luar biasa dengan anggun.
Pengecualian diwakili dalam PHP oleh excpetion kelas (atau mana -mana subkelasnya). Mereka boleh dibangkitkan menggunakan lontaran dan boleh ditangkap menggunakan blok percubaan/tangkapan. Anda boleh melanjutkan pengecualian untuk membuat jenis pengecualian tersuai untuk menjebak kesilapan tertentu.
Kod yang boleh mencetuskan pengecualian diletakkan di dalam blok cuba, dan kod untuk mengendalikan pengecualian diletakkan di dalam blok tangkapan. Pertimbangkan coretan berikut:
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
Jika pengecualian dibuang oleh kaedah getDataFromService () fiktif, ia akan ditangkap dalam blok tangkapan dan mesej akan dipaparkan. Jika getDataFromService () dijalankan dengan jayanya maka aliran akan melewati blok tangkapan dan terus melalui skrip yang lain. Sebarang pengecualian yang dilemparkan dan tidak ditangkap akan menghasilkan ralat E_Fatal dengan mesej "Pengecualian Uncaught."
Kelas pengecualian menawarkan enam kaedah yang berbeza untuk mengakses maklumat tentang apa yang menyebabkan masalah, seperti yang ditunjukkan dalam jadual di bawah.
Membuat pengendali pengecualian tersuai
PHP akan membolehkan anda membuang apa-apa objek seolah-olah ia adalah pengecualian, tetapi sebagai peraturan ibu jari pengecualian harus melanjutkan kelas pengecualian terbina dalam PHP. Berdasarkan jenis objek, anda boleh mengendalikan pengecualian secara berbeza. Pengendalian pengecualian tersuai boleh melakukan tindakan yang sesuai seperti mesej ralat pembalakan dalam fail, memberikan butiran tepat mengenai garis di mana ralat berlaku dengan memeriksa timbunan panggilan, dan lain -lain. Lihat contoh ini:
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
Kod di atas mentakrifkan dua jenis pengecualian tersuai baru, NameException
dan E -melException, yang boleh digunakan untuk menunjukkan kesilapan yang berbeza. Kemudian dalam blok cuba, kod cek jika nilai telah dibekalkan untuk pembolehubah $ nama dan $ e -mel. Jika sama ada kosong, maka pengecualian yang sesuai dibuang menggunakan lontaran. Blok tangkapan yang sepadan dilaksanakan yang mengendalikan ralat.
Pengecualian semula
Cuba/menangkap blok boleh bersarang. Kadang -kadang anda akan mahu menangkap pengecualian, melihat beberapa sifatnya, dan kemudian membuangnya lagi untuk membiarkan blok menangkap induk mengendalikannya. Ini sering berguna untuk memeriksa keadaan ralat dan memutuskan sama ada ia harus membawa maut atau tidak. Kod contoh ini menunjukkan semula pengecualian:
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
Pengendali Pengecualian Uncaught
Sama seperti bagaimana set_error_handler () membolehkan anda menentukan fungsi untuk mengendalikan kesilapan jangka masa, fungsi set_exception_handler () membolehkan anda mengendalikan pengecualian yang menjadikannya semua stack panggilan tanpa ditangkap oleh mana-mana blok tangkapan. Sebagai contoh, jika pengecualian menjadikannya sepanjang stack anda, ia akan menjadi idea yang baik untuk log masuk dalam fail log. Anda boleh membuat fungsi panggil balik dan mendaftarkannya dengan set_exception_handler () seperti yang ditunjukkan dalam contoh di bawah.
<span><span><?php
</span></span><span><span>function errorHandler($errno, $errstr, $errfile, $errline) {
</span></span><span> <span>static $db;
</span></span><span> <span>if (empty($db)) {
</span></span><span> <span>$db = new PDO(DSN, DBUSER, DBPASS);
</span></span><span> <span>}
</span></span><span>
</span><span> <span>$query = "INSERT INTO errorlog (severity, message, filename, lineno, time) VALUES (?, ?, ?, ?, NOW())";
</span></span><span> <span>$stmt = $db->prepare($query);
</span></span><span>
</span><span> <span>switch ($errno) {
</span></span><span> <span>case E_NOTICE:
</span></span><span> <span>case E_USER_NOTICE:
</span></span><span> <span>case E_DEPRECATED:
</span></span><span> <span>case E_USER_DEPRECATED:
</span></span><span> <span>case E_STRICT:
</span></span><span> <span>$stmt->execute(array("NOTICE", $errstr, $errfile, $errline));
</span></span><span> <span>break;
</span></span><span>
</span><span> <span>case E_WARNING:
</span></span><span> <span>case E_USER_WARNING:
</span></span><span> <span>$stmt->execute(array("WARNING", $errstr, $errfile, $errline));
</span></span><span> <span>break;
</span></span><span>
</span><span> <span>case E_ERROR:
</span></span><span> <span>case E_USER_ERROR:
</span></span><span> <span>$stmt->execute(array("FATAL", $errstr, $errfile, $errline));
</span></span><span> <span>exit("FATAL error <span><span>$errstr</span> at <span>$errfile</span>:<span>$errline</span>"</span>);
</span></span><span>
</span><span> <span>default:
</span></span><span> <span>exit("Unknown error at <span><span>$errfile</span>:<span>$errline</span>"</span>);
</span></span><span> <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>set_error_handler("errorHandler");
</span></span><span>
</span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error("Value of <span><span>$test</span> must be 1 or less"</span>, E_USER_NOTICE);
</span></span><span><span>}</span></span>
Ringkasan
PHP menawarkan pelbagai fungsi terbina dalam untuk mengendalikan keadaan ralat, termasuk pembalakan dan memaparkannya. Ia juga memberi anda fleksibiliti untuk menyesuaikan strategi pengendalian ralat anda dengan mendaftarkan pengendali ralat dan menggunakan pengecualian. Kesilapan adalah fakta kehidupan, tetapi diharapkan maklumat yang saya sampaikan dalam artikel ini akan membantu anda mengendalikan mereka dengan lebih anggun.
imej melalui Ilya Andriyanov / Shutterstock
Soalan Lazim (Soalan Lazim) Mengenai Pengendalian Ralat dalam PHP
Apakah kepentingan pengendalian ralat dalam php?
Pengendalian ralat dalam PHP adalah penting untuk mengekalkan integriti dan fungsi aplikasi web. Ia membantu pemaju mengenal pasti dan membetulkan isu -isu yang mungkin timbul semasa pelaksanaan skrip. Tanpa pengendalian ralat yang betul, isu kecil boleh menyebabkan masalah yang signifikan, seperti merosakkan permohonan atau mendedahkan maklumat sensitif kepada pengguna. Ia juga meningkatkan pengalaman pengguna kerana ia membolehkan pemaju mengawal apa yang pengguna lihat apabila ralat berlaku, dan bukannya memaparkan mesej ralat yang mengelirukan.
Secara lalai, PHP menghantar laporan ralat ke log ralat pelayan dan memaparkan mesej ralat pada skrin. Tingkah laku ini tidak sesuai untuk laman web secara langsung kerana ia dapat mendedahkan maklumat sensitif kepada pengguna. Oleh itu, disyorkan untuk menukar tetapan pengendalian ralat lalai untuk laman web langsung. Kesalahan maut adalah kesilapan kritikal, seperti memanggil fungsi yang tidak wujud atau menulis ke fail yang tidak dapat ditulis. Amaran adalah kesilapan bukan maut yang membolehkan skrip terus berjalan. Kesalahan parse berlaku apabila terdapat kesilapan sintaks dalam skrip. Notis adalah kesilapan kecil atau kemungkinan kesilapan yang ditemui oleh PHP semasa melaksanakan skrip. Fungsi ini membolehkan anda menentukan peraturan dan pengecualian pengendalian kesilapan tersuai. Anda boleh menentukan fungsi tersuai untuk menangani kesilapan, yang boleh berguna untuk kesilapan pembalakan atau menghantar pemberitahuan ralat.
Bagaimana saya boleh mematikan pelaporan ralat dalam php? Walau bagaimanapun, mematikan pelaporan ralat tidak disyorkan untuk laman web secara langsung kerana ia boleh membuat sukar untuk mengenal pasti dan membetulkan isu -isu.
Atas ialah kandungan terperinci phpmaster | Pengendalian ralat di PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!