Pemprosesan Ralat PHP

Di PHP, pengelolaan kesalahan baku adalah sederhana. Satu pesan akan dihantar ke pelayar, pesan itu mengandungi nama fail, bilangan baris serta pesan deskripsi kesalahan.

Pemprosesan Ralat PHP

Pada masa mencipta skrip dan aplikasi web, penanganan kesalahan adalah bagian penting. Jika kod anda kurang dari pengkodean deteksi kesalahan, program kelihatannya kurang profesional dan membuka kesempatan risiko keselamatan.

Panduan ini memaparkan beberapa cara deteksi kesalahan yang paling penting di PHP.

Kami akan memberikan penjelasan tentang berbagai cara penanganan kesalahan:

  • Perintah "die()" yang sederhana
  • Kesalahan yang disesuaikan dan pemecat kesalahan
  • Laporan kesalahan

Penanganan kesalahan dasar: gunakan fungsi die()

Contoh skrip yang sederhana untuk membuka fail teks:

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

Jika fail tidak wujud, anda akan mendapat kesalahan seperti ini:

Amaran: fopen(welcome.txt) [function.fopen]: gagal membuka aliran: 
Tiada fail atau direktori di C:\webfolder\test.php pada baris 2

Untuk menghindari pengguna mendapat mesej kesalahan seperti di atas, kita mengesan adanya fail sebelum mengakses fail:

<?php
if(!file_exists("welcome.txt"))
 {
 die("Fail tak ditemui");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

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

Fail tak ditemui

Bandingkan dengan kod sebelumnya, kod di atas lebih efektif, kerana ia mengambil mekanisme penanganan kesalahan yang sederhana untuk menghentikan skrip setelah kesalahan.

Walau bagaimanapun, menghentikan skrip secara mudah bukan selalu cara yang sesuai. Bagaimanakah fungsi alternatif PHP untuk menghadapi kesalahan?

Membuat penanganan kesalahan yang disesuaikan

Membuat penanganan kesalahan yang disesuaikan sangat mudah. Kita hanya membuat fungsi khusus, yang dapat dipanggil fungsi itu saat terjadi kesalahan dalam PHP.

Fungsi ini mesti dapat menghadapi sekurang-kurangnya dua parameter (tingkatan kesalahan dan mesej kesalahan), tetapi boleh menerima maksimum lima parameter (pilihan: fail, nombor baris serta konteks kesalahan):

Sintaks

error_function(error_level, error_message,
error_file, error_line, error_context)
Parameter Deskripsi
error_level

Wajib. Tingkatan laporan kesalahan yang ditakrifkan pengguna. Harus adalah nilai bilangan.

Lihat jadual di bawah: Tingkatan laporan kesalahan.

error_message Wajib. Mesej kesalahan yang ditetapkan untuk kesalahan yang ditakrifkan pengguna.
error_file Pilihan. Tentukan nama file tempat terjadi kesalahan.
error_line Pilihan. Tentukan nomor baris tempat terjadi kesalahan.
error_context Pilihan. Tentukan array yang mengandung setiap variabel yang digunakan saat terjadi kesalahan serta nilai mereka.

Tingkat Laporan Kesalahan

Tingkat laporan kesalahan ini adalah jenis kesalahan yang berbeda yang program penanganan kesalahan dimaksudkan untuk menangani:

Nilai Konstanta Deskripsi
2 E_WARNING Kesalahan run-time yang tidak parah. Tidak menghentikan eksekusi skrip.
8 E_NOTICE

Pemberitahuan Run-time.

Skrip mendeteksi kemungkinan terjadi kesalahan, tetapi mungkin juga terjadi saat skrip berjalan dengan baik.

256 E_USER_ERROR Kesalahan yang dibuat pengguna yang parah. Mirip dengan E_ERROR yang disetel programer menggunakan fungsi PHP trigger_error().
512 E_USER_WARNING Peringatan pengguna yang tidak parah. Mirip dengan E_WARNING yang disetel programer menggunakan fungsi PHP trigger_error().
1024 E_USER_NOTICE Pemberitahuan yang dibuat pengguna. Mirip dengan E_NOTICE yang disetel programer menggunakan fungsi PHP trigger_error().
4096 E_RECOVERABLE_ERROR Kesalahan yang dapat ditangkap yang parah. Mirip dengan E_ERROR, tetapi dapat ditangkap oleh penanganan kesalahan yang ditentukan pengguna (lihat set_error_handler()).
8191 E_ALL

Semua kesalahan dan peringatan, kecuali tingkat E_STRICT.

(Dalam PHP 6.0, E_STRICT adalah bagian dari E_ALL)

Sekarang, biarkan kita membuat fungsi untuk menangani kesalahan:

function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Akhir Skrip";
 die();
 }

Kode di atas adalah fungsi penanganan kesalahan yang sederhana. Saat ia diaktifkan, ia akan mengambil tingkat kesalahan dan pesan kesalahan. kemudian ia akan menampilkan tingkat kesalahan dan pesan, dan menghentikan skrip.

Sekarang, kami telah membuat fungsi penanganan kesalahan, kami perlu menentukan kapan fungsi ini diaktifkan.

Set Error Handler

Program penanganan kesalahan baku PHP adalah program penanganan kesalahan yang baku. Kami ingin mengubah fungsi di atas menjadi program penanganan kesalahan baku selama skrip berjalan.

Dapat diubah program penanganan kesalahan untuk hanya berlaku bagi kesalahan tertentu, sehingga skrip dapat menangani kesalahan dengan cara yang berbeda.

set_error_handler("customError");

Kami menginginkan fungsi pribadi kita untuk menangani semua kesalahan, set_error_handler() hanya memerlukan parameter satu, dapat menambahkan parameter kedua untuk menentukan tingkat kesalahan.

Contoh

Uji pengendali kesalahan ini dengan mencuba untuk output variable yang tak wujud:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

Output kode di atas seharusnya seperti ini:

Error: [8] Variable tak terdefinisi: test

Mengaktifkan Kesalahan

Pada tempat penginputan pengguna di skrip, mengaktifkan kesalahan yang berkesan jika input pengguna tidak sah. Dalam PHP, tugas ini dijalankan oleh trigger_error().

Contoh

Dalam contoh ini, jika variable "test" lebih besar daripada "1", kesalahan akan terjadi:

<?php
$test=2;
if ($test>1)
{
trigger_error("Nama nilai mesti 1 atau di bawah");
}
?>

Output kode di atas seharusnya seperti ini:

Notice: Nama nilai mesti 1 atau di bawah
di C:\webfolder\test.php di baris 6

Anda boleh membangunkan kesalahan di mana-mana tempat di skrip, melalui parameter kedua yang ditambahkan, anda dapat menentukan tingkatan kesalahan yang diaktifkan.

Jenis kesalahan yang mungkin:

  • E_USER_ERROR - Kesalahan run-time pengguna yang parah. Kesalahan tidak dapat pulih. Eksekusi skrip dihentikan.
  • E_USER_WARNING - Amat tidak menyebabkan kesalahan pengguna run-time. Eksekusi skrip tidak dihentikan.
  • E_USER_NOTICE - Lalai. Pemberitahuan run-time pengguna. Skrip mendapati kesalahan yang mungkin, juga boleh terjadi sewaktu skrip berjalan dengan baik.

Contoh

Dalam contoh ini, jika variable "test" lebih besar daripada "1", kesalahan E_USER_WARNING akan terjadi. Jika kesalahan E_USER_WARNING terjadi, kita akan menggunakan pengendali kesalahan yang disediakan dan mengakhiri skrip:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Akhir Skrip";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Nilai mesti 1 atau di bawah",E_USER_WARNING);
 }
?>

Output kode di atas seharusnya seperti ini:

Error: [512] Nilai mesti 1 atau di bawah
Akhir Skrip

Sekarang, kami telah menghabiskan masa untuk menghasilkan sendiri error, serta mengeaktifkannya, kini kita kajian tentang perekod kesalahan.

Perekod Kesalahan

Secara lalai, berdasarkan konfigurasi error_log di php.ini, PHP mengirimkan rekod kesalahan kepada sistem perekod kesalahan pelayan atau fail. Dengan menggunakan fungsi error_log(), anda dapat mengirimkan rekod kesalahan ke tempat tujuan yang ditentukan.

Menghantar mesej kesalahan kepada diri sendiri melalui e-mel adalah cara yang baik untuk menerima pemberitahuan kesalahan yang ditentukan.

Menghantar mesej kesalahan melalui E-Mail

Dalam contoh di bawah, jika kesalahan tertentu terjadi, kami akan mengirim e-mail dengan pesan kesalahan dan mengakhiri skrip:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Pemangku Situs telah di pemberitahu";
 error_log("Error: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Nilai mesti 1 atau di bawah",E_USER_WARNING);
 }
?>

Output kode di atas seharusnya seperti ini:

Error: [512] Nilai mesti 1 atau di bawah
Pemangku Situs telah di pemberitahu

E-mail yang diterima dari kode di atas seperti ini:

Error: [512] Nilai mesti 1 atau di bawah

Metode ini tidak sesuai untuk semua kesalahan. Kesalahan biasa seharusnya direkam di server melalui sistem perekam PHP baku.