Pengendalian ralat PHP

Pengendalian Ralat PHP

Dalam PHP, pengendalian ralat lalai adalah sangat mudah. Mesej ralat dihantar ke penyemak imbas dengan nama fail, nombor baris dan mesej yang menerangkan ralat.

Pengendalian Ralat PHP

Pengendalian ralat merupakan bahagian penting semasa membuat skrip dan aplikasi web. Jika kod anda tidak mempunyai pengekodan pengesanan ralat, program ini akan kelihatan tidak profesional dan membuka pintu kepada risiko keselamatan.

Tutorial ini merangkumi beberapa kaedah pengesanan ralat yang paling penting dalam PHP.

Kami akan menerangkan kaedah pengendalian ralat yang berbeza untuk anda: 🎜>· Pelaporan ralat

Pengendalian ralat asas: menggunakan fungsi die()

contoh pertama menunjukkan skrip mudah yang membuka fail teks:

<?php
$file=fopen("welcome.txt","r");
?>

Jika fail itu tidak wujud, anda akan mendapat ralat seperti ini:

Amaran: fopen(welcome.txt) [function .fopen]: gagal membuka strim:

Tiada fail atau direktori sedemikian dalam /www/runoob/test/test.php pada baris 2

Untuk mengelakkan pengguna mendapat mesej ralat seperti di atas, kami menyemak sama ada fail itu wujud sebelum mengaksesnya:

<?php
if(!file_exists("welcome.txt"))
{
         die("文件不存在");
}
else
{
         $file=fopen("welcome.txt","r");
}
?>

Sekarang, jika fail itu tidak wujud, anda akan mendapat mesej ralat seperti ini:

Fail tidak wujud

Kod di atas adalah lebih cekap daripada kod sebelumnya, Ini disebabkan oleh mekanisme pengendalian ralat mudah yang menamatkan skrip selepas ralat.

Walau bagaimanapun, menamatkan skrip tidak semestinya sesuai. Mari kita periksa fungsi PHP alternatif untuk mengendalikan ralat.

Membuat pengendali ralat tersuai

Membuat pengendali ralat tersuai adalah sangat mudah. Kami hanya mencipta fungsi khusus yang boleh dipanggil apabila ralat berlaku dalam PHP.

Fungsi mesti boleh mengendalikan sekurang-kurangnya dua parameter (tahap ralat dan mesej ralat), tetapi boleh menerima sehingga lima parameter (pilihan: fail, nombor baris dan konteks ralat):

Sintaks

error_function(error_level,error_message,

error_file,error_line,error_context)

Error Levels

Tahap pelaporan ralat ini ialah pelbagai jenis ralat yang dikendalikan oleh pengendali ralat yang ditentukan pengguna:

QQ图片20161009160023.png

Sekarang, mari kita cipta Fungsi untuk dikendalikan

ralat

: QQ图片20161009160053.png

function customError($errno, $errstr)
{
         echo "<b>Error:</b> [$errno] $errstr<br>";
         echo "脚本结束";
         die();
}

Kod di atas ialah fungsi pengendalian ralat yang mudah. Apabila ia dicetuskan, ia mendapat tahap ralat dan mesej ralat. Ia kemudian mencetak tahap ralat dan mesej, dan menamatkan skrip.

Sekarang kita telah mencipta fungsi pengendalian ralat, kita perlu menentukan masa untuk menyalakannya.

Tetapkan pengendali ralat

Pengendali ralat lalai PHP ialah pengendali ralat terbina dalam. Kami akan mengubah fungsi di atas menjadi pengendali ralat lalai apabila skrip berjalan.

Pengendali ralat boleh diubah suai untuk digunakan hanya pada ralat tertentu, supaya skrip boleh mengendalikan ralat yang berbeza dengan cara yang berbeza. Walau bagaimanapun, dalam kes ini, kami akan menggunakan pengendali ralat tersuai kami untuk semua ralat:

set_error_handler("customError");

Oleh kerana kami mahu fungsi tersuai kami untuk Untuk mengendalikan semua ralat, set_error_handler() hanya memerlukan satu parameter, dan parameter kedua boleh ditambah untuk menentukan tahap ralat.

Contoh

Uji pengendali ralat ini dengan cuba mengeluarkan pembolehubah yang tidak wujud:

<?php
// 错误处理函数
function customError($errno, $errstr)
{
         echo "<b>Error:</b> [$errno] $errstr";
}
// 设置错误处理函数
set_error_handler("customError");
// 触发错误
echo($test);
?>

Keluaran kod di atas kelihatan seperti ini:

Ralat : [8] Pembolehubah tidak ditentukan: ujian

Ralat Pencetus

Pada titik dalam skrip di mana pengguna memasukkan data, adalah berguna untuk mencetuskan ralat apabila input pengguna tidak sah. Dalam PHP, tugas ini dicapai oleh fungsi trigger_error().

Contoh

Dalam contoh ini, jika pembolehubah "ujian" lebih besar daripada "1", ralat akan berlaku:

<?php

$ test=2;

if ($test>1)

{

trigger_error("Nilai pembolehubah mestilah kurang daripada atau sama dengan 1");

}

?>

Keluaran kod di atas adalah seperti berikut:

Notis: Nilai pembolehubah mestilah kurang daripada atau sama dengan 1

dalam /www/test/runoob php pada baris 5

Anda boleh mencetuskan ralat di mana-mana dalam skrip Dengan menambahkan parameter kedua, anda boleh menentukan tahap ralat yang dicetuskan.

Jenis ralat yang mungkin:

E_USER_ERROR - Ralat masa jalan yang dijana pengguna maut. Ralat tidak dapat dipulihkan. Pelaksanaan skrip terganggu.

· E_USER_WARNING - Amaran masa jalan yang dijana pengguna yang tidak membawa maut. Pelaksanaan skrip tidak terganggu.

· E_USER_NOTICE - Lalai. Pemberitahuan masa jalan yang dijana pengguna. Berlaku apabila skrip menemui kemungkinan ralat, tetapi juga boleh berlaku apabila skrip berjalan seperti biasa.

Contoh

Dalam contoh ini, jika pembolehubah "ujian" lebih besar daripada "1", ralat E_USER_WARNING berlaku. Jika E_USER_WARNING berlaku, kami akan menggunakan pengendali ralat tersuai kami dan menamatkan skrip:

<?php
// 错误处理函数
function customError($errno, $errstr)
{
         echo "<b>Error:</b> [$errno] $errstr<br>";
         echo "脚本结束";
         die();
}
// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);
// 触发错误
$test=2;
if ($test>1)
{
         trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>

Output kod di atas akan kelihatan seperti ini:

Ralat: [512] Nilai pembolehubah mestilah kurang daripada atau sama dengan 1

Tamat skrip

Sekarang kita telah belajar cara mencipta ralat kita sendiri dan cara mencetuskannya, mari kita kaji pengelogan ralat.

Ralat rekod

Secara lalai, PHP menghantar rekod ralat ke sistem pengelogan pelayan atau fail mengikut konfigurasi error_log dalam php.ini. Dengan menggunakan fungsi error_log(), anda boleh menghantar rekod ralat ke fail tertentu atau destinasi jauh.

Menge-melkan mesej ralat kepada diri sendiri ialah cara terbaik untuk mendapatkan pemberitahuan tentang ralat yang ditentukan.

Hantar mesej ralat melalui e-mel

Dalam contoh di bawah, jika ralat tertentu berlaku, kami akan menghantar e-mel dengan mesej ralat dan menamatkan skrip:

<?php
// 错误处理函数
function customError($errno, $errstr)
{
         echo "<b>Error:</b> [$errno] $errstr<br>";
         echo "已通知网站管理员";
         error_log("Error: [$errno] $errstr",1,
         "someone@example.com","From: webmaster@example.com");
}
// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);
// 触发错误
$test=2;
if ($test>1)
{
         trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>

The output kod di atas adalah seperti berikut:

Ralat: [512] Nilai pembolehubah mestilah kurang daripada atau sama dengan 1

Pentadbir laman web telah dimaklumkan

Diterima daripada kod di atas E-mel adalah seperti berikut:

Ralat: [512] Nilai pembolehubah mestilah kurang daripada atau sama dengan 1

Kaedah ini tidak sesuai untuk semua ralat. Ralat umum harus dilog pada pelayan menggunakan sistem pengelogan PHP lalai.


Meneruskan pembelajaran
||
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "已通知网站管理员"; error_log("Error: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>
  • Cadangan kursus
  • Muat turun perisian kursus