Rumah > pembangunan bahagian belakang > tutorial php > phpmaster | Pengendalian ralat di PHP

phpmaster | Pengendalian ralat di PHP

Christopher Nolan
Lepaskan: 2025-03-02 08:31:10
asal
500 orang telah melayarinya

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.

Takeaways Key

    Pengendalian ralat PHP adalah penting untuk mengekalkan integriti dan fungsi aplikasi web. Ia membantu mengenal pasti dan membetulkan isu -isu yang mungkin timbul semasa pelaksanaan skrip, meningkatkan pengalaman pengguna dengan mengawal apa yang mereka lihat ketika ralat berlaku.
  • PHP menawarkan beberapa fungsi terbina dalam untuk pengendalian ralat, termasuk pembalakan dan memaparkannya. Ia juga menyediakan fleksibiliti untuk menyesuaikan strategi pengendalian ralat dengan mendaftarkan pengendali ralat dan menggunakan pengecualian.
  • Pengendalian ralat tersuai dalam PHP boleh dicapai menggunakan fungsi set_error_handler () dan set_exception_handler (). Ini membolehkan pemaju untuk menentukan peraturan dan pengecualian pengendalian kesilapan tersuai, yang boleh berguna untuk kesilapan pembalakan atau menghantar pemberitahuan ralat.
  • Pengecualian dalam PHP adalah peristiwa yang berlaku semasa pelaksanaan skrip, mengganggu aliran normal arahan. Mereka boleh dikendalikan menggunakan percubaan, menangkap, dan akhirnya blok. Sekiranya tiada blok tangkapan ditemui apabila pengecualian dilemparkan, PHP akan memaparkan ralat maut dan berhenti melaksanakan skrip.
tahap pelaporan ralat php

Semua kesilapan dan amaran harus dilog masuk. Berdasarkan keterukan kesilapan, pemberitahuan harus dihantar ke sistem/pasukan lain. Supaya anda dapat mengukur keterukannya dengan lebih baik, PHP menyediakan beberapa tahap ralat terbina dalam untuk menggambarkan sifat kesilapan. Setiap peringkat diwakili oleh nilai integer dan dinamakan tetap yang boleh digunakan oleh pengaturcara. Jadual di bawah diambil dari dokumentasi PHP rasmi dan menunjukkan beberapa tahap yang berbeza.

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. phpmaster | Pengendalian ralat di PHP

Arahan konfigurasi boleh ditetapkan sama ada dalam php.ini, dalam fail konfigurasi pelayan web (httpd.conf atau .htaccess file), atau pada masa larian dalam skrip anda menggunakan fungsi ini_set (). Baca dokumentasi untuk maklumat lanjut mengenai arahan dan bagaimana/di mana untuk menetapkannya.

Membuat pengendali ralat tersuai

Ia juga amalan yang baik untuk tidak memaparkan kesilapan mentah kepada pengguna akhir. Kesilapan yang dipaparkan hendaklah dicabut dengan mesej ralat yang mesra dan adat. PHP bukan sahaja menyediakan fungsi terbina dalam untuk pembalakan dan memaparkan kesilapan, tetapi juga untuk menaikkannya. Anda boleh mencetuskan kesilapan tahap tertentu menggunakan trigger_error (). Sebagai contoh, kod ini mencetuskan amaran e_user_notice jika nilai $ ujian lebih besar daripada 1:
<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

phpmaster | Pengendalian ralat di PHP 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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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.

phpmaster | Pengendalian ralat di PHP

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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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>
Salin selepas log masuk

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.

Bagaimanakah PHP mengendalikan kesilapan secara lalai?

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.

Apakah pengecualian dalam PHP? Apabila pengecualian dilemparkan, PHP akan berhenti melaksanakan skrip dan mula mencari blok tangkapan untuk mengendalikan pengecualian. Sekiranya tiada blok tangkapan ditemui, PHP akan memaparkan ralat maut dan berhenti melaksanakan skrip. Blok percubaan mengandungi kod yang boleh membuang pengecualian. Blok tangkapan mengandungi kod untuk mengendalikan pengecualian. Blok akhirnya mengandungi kod yang akan dilaksanakan tanpa mengira sama ada pengecualian dilemparkan atau tidak. Kesalahan dikendalikan oleh enjin PHP dan boleh dikawal menggunakan tetapan pelaporan ralat dan pengendali ralat tersuai. Pengecualian, sebaliknya, dikendalikan oleh skrip dan boleh dikawal menggunakan cuba, menangkap, dan akhirnya blok.

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.

Apakah peranan pengendali @ dalam pengendalian ralat PHP? Apabila disediakan kepada ungkapan dalam PHP, sebarang mesej ralat yang mungkin dihasilkan oleh ungkapan itu akan diabaikan.

Bagaimana saya boleh log ralat dalam php?

php Menyediakan fungsi error_log () untuk menghantar mesej ralat ke log ralat pelayan atau ke fail yang ditentukan. Fungsi ini berguna untuk menjejaki kesilapan dan debugging. Anda juga boleh mengkonfigurasi PHP untuk log semua kesilapan dengan menukar arahan log_errors dalam fail php.ini.

Atas ialah kandungan terperinci phpmaster | Pengendalian ralat di PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan