Pemrosesan Error PHP

Pada PHP, penanganan kesalahan baku sangat sederhana. Sebuah pesan akan dikirim ke browser, pesan ini berisi nama file, nomor baris serta pesan deskripsi kesalahan.

Pemrosesan Error PHP

Pada saat membuat skrip dan aplikasi web, penanganan kesalahan adalah bagian penting. Jika kode Anda kurang dari pengecekan kesalahan, program Anda terlihat kurang profesional dan membuka kesempatan resiko keamanan.

Panduan ini memperkenalkan beberapa metode deteksi kesalahan yang paling penting di PHP.

Kami akan menjelaskan berbagai metode penanganan kesalahan:

  • Perintah "die()" sederhana
  • Kesalahan khusus dan pengacaukan kesalahan
  • Laporan kesalahan

Penanganan kesalahan dasar: menggunakan fungsi die()

Contoh sederhana skrip untuk membuka file teks:

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

Jika file tidak ada, Anda akan mendapatkan kesalahan seperti ini:

Peringatan: fopen(welcome.txt) [function.fopen]: gagal membuka stream: 
Tidak ada file atau direktori di C:\webfolder\test.php pada baris 2

Untuk menghindari pengguna mendapatkan pesan kesalahan seperti di atas, kita memeriksa apakah file ada sebelum mengakses file:

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

Sekarang, jika file tidak ada, Anda akan mendapatkan pesan kesalahan seperti ini:

File tidak ditemukan

Dibandingkan dengan kode sebelumnya, kode di atas lebih efektif, karena ia menggunakan mekanisme penanganan kesalahan sederhana untuk menghentikan skrip setelah kesalahan.

Tetapi, menghentikan skrip secara sederhana bukan cara yang selalu paling tepat. Berikut ini adalah beberapa fungsi PHP alternatif untuk menangani kesalahan.

Membuat penanganan kesalahan khusus

Membuat penanganan kesalahan khusus sangat mudah. Kita hanya membuat fungsi khusus yang dapat dipanggil saat terjadi kesalahan di PHP.

Fungsi ini harus mampu menangani setidaknya dua parameter (tingkat kesalahan dan pesan kesalahan), tetapi dapat menerima hingga lima parameter (opsional: file, nomor baris serta konteks kesalahan):

Sintaks

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

Wajib. Tingkat laporan kesalahan yang ditentukan pengguna untuk kesalahan. Harus berupa nilai angka.

Lihat tabel di bawah: tingkat laporan kesalahan.

error_message Wajib. Pesan kesalahan yang ditentukan pengguna untuk kesalahan.
error_file Pilihan. Tentukan nama file tempat terjadi kesalahan.
error_line Pilihan. Tentukan nomor baris tempat terjadi kesalahan.
error_context Pilihan. Tentukan daftar 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 diinginkan penanganan kesalahan untuk menangani:

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

Pemberitahuan Run-time.

Skrip mendeteksi kemungkinan terjadi kesalahan, tetapi ini dapat terjadi saat skrip berjalan dengan baik.

256 E_USER_ERROR Kesalahan pengguna yang kritis. Mirip dengan E_ERROR yang ditetapkan programer menggunakan fungsi PHP trigger_error().
512 E_USER_WARNING Peringatan pengguna yang tidak kritis. Mirip dengan E_WARNING yang ditetapkan programer menggunakan fungsi PHP trigger_error().
1024 E_USER_NOTICE Pemberitahuan yang dibuat pengguna. Mirip dengan E_NOTICE yang ditetapkan programer menggunakan fungsi PHP trigger_error().
4096 E_RECOVERABLE_ERROR Kesalahan yang kritis yang dapat ditangkap. 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.

(Pada PHP 6.0, E_STRICT adalah bagian dari E_ALL)

Sekarang, mari kita buat 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, dan kami perlu menentukan kapan fungsi ini diaktifkan.

Set Error Handler

Penanganan kesalahan baku PHP adalah penanganan kesalahan yang baku. Kami berencana untuk merubah fungsi di atas menjadi penanganan kesalahan baku selama skrip berjalan.

Dapat diubah penanganan kesalahan untuk hanya berlaku bagi kesalahan tertentu, sehingga skrip dapat dihandle dengan cara yang berbeda untuk kesalahan yang berbeda. Namun, dalam kasus ini, kami berencana untuk menggunakan penanganan kesalahan khusus kita untuk semua kesalahan:

set_error_handler("customError");

Karena kami ingin fungsi khusus kita untuk menangani semua kesalahan, set_error_handler() hanya memerlukan parameter satu, dapat menambahkan parameter kedua untuk menentukan tingkat kesalahan.

Contoh

Uji coba penanganan kesalahan ini dengan mencoba mengecualikan variabel yang tak ada:

<?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] Variabel tak didefinisikan: test

Memicu kesalahan

Di tempat penginputan data pengguna di skrip, saat input pengguna tidak valid, memicu kesalahan sangat berguna. Dalam PHP, tugas ini diambil alih oleh fungsi trigger_error().

Contoh

Dalam contoh ini, jika variabel "test" lebih besar dari "1", kesalahan akan terjadi:

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

Output kode di atas seharusnya seperti ini:

Notice: Nilai harus 1 atau di bawah
di C:\webfolder\test.php di baris 6

Anda dapat memicu kesalahan di tempat mana saja di skrip, dengan menambahkan parameter kedua, Anda dapat menentukan tingkat kesalahan yang dipicu.

Jenis kesalahan yang mungkin:

  • E_USER_ERROR - Kesalahan run-time yang dibuat pengguna yang fatal. Kesalahan tidak dapat pulih. Eksekusi skrip terganggu.
  • E_USER_WARNING - Peringatan run-time yang dibuat pengguna yang tidak fatal. Eksekusi skrip tidak terganggu.
  • E_USER_NOTICE - Default. Pemberitahuan run-time yang dibuat pengguna. Skrip menemukan kesalahan yang mungkin, juga dapat terjadi saat skrip berjalan dengan baik.

Contoh

Dalam contoh ini, jika variabel "test" lebih besar dari "1", kesalahan E_USER_WARNING akan terjadi. Jika terjadi E_USER_WARNING, kita akan menggunakan penanganan kesalahan yang disesuaikan 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 harus 1 atau di bawah",E_USER_WARNING);
 }
?>

Output kode di atas seharusnya seperti ini:

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

Sekarang, kami telah belajar tentang cara membuat sendiri error, serta cara memicu mereka, sekarang kita studi tentang catatan kesalahan.

Catatan kesalahan

Secara default, berdasarkan konfigurasi error_log di php.ini, PHP mengirim catatan kesalahan ke sistem perekam kesalahan server atau ke berkas. Dengan menggunakan fungsi error_log(), Anda dapat mengirim catatan kesalahan ke tujuan yang ditentukan.

Mengirim pesan kesalahan kepada diri sendiri melalui email adalah cara yang bagus untuk memperoleh pemberitahuan kesalahan yang ditentukan.

Mengirim pesan kesalahan melalui E-Mail

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

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Webmaster telah diperingatkan";
 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 harus 1 atau di bawah",E_USER_WARNING);
 }
?>

Output kode di atas seharusnya seperti ini:

Error: [512] Nilai harus 1 atau di bawah
Webmaster telah diperingatkan

Email yang diterima dari kode di atas seperti ini:

Error: [512] Nilai harus 1 atau di bawah

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