Di PHP, penanganan kesalahan defaultnya sederhana. Pesan kesalahan dikirim ke browser dengan nama file, nomor baris, dan pesan yang menjelaskan kesalahan tersebut.
Penanganan error merupakan bagian penting saat membuat skrip dan aplikasi Web. Jika kode Anda tidak memiliki kode pendeteksi kesalahan, program akan terlihat tidak profesional dan membuka pintu terhadap risiko keamanan.
Tutorial ini memperkenalkan beberapa metode deteksi kesalahan terpenting dalam PHP.
Kami akan menjelaskan berbagai metode penanganan kesalahan kepada Anda:
Pernyataan sederhana "mati ()".
Kesalahan khusus dan pemicu kesalahan
laporan kesalahan
Contoh pertama menunjukkan skrip sederhana yang membuka file teks:
<?php$file=fopen("selamat datang.txt","r");?>
Jika file tidak ada, Anda akan mendapatkan error seperti ini:
Peringatan: fopen(welcome.txt) [function.fopen]: gagal membuka streaming: Tidak ada file atau direktori seperti itu di /www/codercto/test/test.php on line 2
Untuk menghindari pengguna mendapatkan pesan error seperti di atas, kami memeriksa apakah file tersebut ada sebelum mengaksesnya:
<?phpif(!file_exists("welcome.txt")){ die("File tidak ada");}else{ $file=fopen("welcome.txt","r");}?>
Nah, jika file tersebut tidak ada, Anda akan mendapatkan pesan error seperti ini:
Berkas tidak ada
Kode di atas lebih efisien dibandingkan kode sebelumnya karena menggunakan mekanisme penanganan kesalahan sederhana untuk menghentikan skrip setelah terjadi kesalahan.
Namun, menghentikan skrip saja tidak selalu tepat. Mari kita periksa fungsi alternatif PHP untuk menangani kesalahan.
Membuat penangan kesalahan khusus sangat sederhana. Kami hanya membuat fungsi khusus yang dapat dipanggil ketika terjadi kesalahan di PHP.
Fungsi tersebut harus mampu menangani setidaknya dua parameter (tingkat kesalahan dan pesan kesalahan), namun dapat menerima hingga lima parameter (opsional: file, nomor baris, dan konteks kesalahan):
fungsi_kesalahan(tingkat_kesalahan,pesan_kesalahan,file_kesalahan,garis_kesalahan,konteks_kesalahan)
parameter | menggambarkan |
---|---|
tingkat_kesalahan | Diperlukan. Menentukan tingkat pelaporan kesalahan untuk kesalahan yang ditentukan pengguna. Harus berupa angka. Lihat tabel di bawah ini: Tingkat pelaporan kesalahan. |
pesan_kesalahan | Diperlukan. Menentukan pesan kesalahan untuk kesalahan yang ditentukan pengguna. |
file_kesalahan | Opsional. Menentukan nama file tempat kesalahan terjadi. |
garis_kesalahan | Opsional. Menentukan nomor baris tempat kesalahan terjadi. |
kesalahan_konteks | Opsional. Menentukan array yang berisi setiap variabel yang digunakan saat kesalahan terjadi dan nilainya. |
Tingkat pelaporan kesalahan ini adalah jenis kesalahan berbeda yang ditangani oleh penangan kesalahan yang ditentukan pengguna:
nilai | konstan | menggambarkan |
---|---|---|
2 | E_PERINGATAN | Kesalahan run-time yang tidak fatal. Jangan jeda eksekusi skrip. |
8 | E_PEMBERITAHUAN | pemberitahuan waktu berjalan. Terjadi ketika skrip menemukan kemungkinan kesalahan, tetapi dapat juga terjadi ketika skrip berjalan normal. |
256 | E_USER_ERROR | Kesalahan fatal yang disebabkan oleh pengguna. Ini mirip dengan E_ERROR yang disetel oleh pemrogram menggunakan fungsi PHP trigger_error(). |
512 | E_USER_PERINGATAN | Peringatan buatan pengguna yang tidak fatal. Ini mirip dengan E_WARNING yang disetel oleh pemrogram menggunakan fungsi PHP trigger_error(). |
1024 | E_USER_PEMBERITAHUAN | Notifikasi yang dibuat pengguna. Ini mirip dengan E_NOTICE yang diatur oleh pemrogram menggunakan fungsi PHP trigger_error(). |
4096 | E_RECOVERABLE_ERROR | Kesalahan fatal yang bisa diperbaiki. Seperti E_ERROR, tetapi dapat ditangkap oleh penangan yang ditentukan pengguna. (Lihat set_error_handler()) |
8191 | E_SEMUA | Semua kesalahan dan peringatan. (Dalam PHP 5.4, E_STRICT menjadi bagian dari E_ALL) |
Sekarang, mari buat fungsi yang menangani kesalahan:
function customError($errno, $errstr){ echo "<b>Kesalahan:</b> [$errno] $errstr<br>"; echo "Skrip telah berakhir();}
Kode di atas adalah fungsi penanganan kesalahan sederhana. Ketika dipicu, ia mendapat tingkat kesalahan dan pesan kesalahan. Kemudian mencetak tingkat kesalahan dan pesan, dan menghentikan skrip.
Sekarang kita telah membuat fungsi penanganan kesalahan, kita perlu menentukan kapan harus mengaktifkannya.
Penangan kesalahan default PHP adalah penangan kesalahan bawaan. Kami akan mengubah fungsi di atas menjadi penangan kesalahan default saat skrip berjalan.
Penangan kesalahan dapat dimodifikasi untuk diterapkan hanya pada kesalahan tertentu, sehingga skrip dapat menangani kesalahan yang berbeda dengan cara yang berbeda. Namun, dalam kasus ini kami akan menggunakan penangan kesalahan khusus kami untuk semua kesalahan:
set_error_handler("kesalahan khusus");
Karena kita ingin fungsi khusus menangani semua kesalahan, set_error_handler() hanya memerlukan satu argumen, dan argumen kedua dapat ditambahkan untuk menentukan tingkat kesalahan.
Uji pengendali kesalahan ini dengan mencoba mencetak variabel yang tidak ada:
<?php// Fungsi penanganan kesalahan function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr";}// Tetapkan fungsi penanganan kesalahan set_error_handler("customError") ;//Memicu kesalahan echo($test);?>
Output dari kode di atas terlihat seperti ini:
Kesalahan: [8] Variabel tidak terdefinisi: tes
Dimana user memasukkan data pada sebuah script, hal ini berguna untuk memicu error ketika inputan user tidak valid. Di PHP, tugas ini diselesaikan dengan fungsi trigger_error().
Dalam contoh ini, jika variabel "test" lebih besar dari "1", akan terjadi kesalahan:
<?php$test=2;if ($test>1){ trigger_error("Nilai variabel harus kurang dari atau sama dengan 1");}?>
Output dari kode di atas terlihat seperti ini:
Perhatian: Nilai variabel harus kurang dari atau sama dengan 1in /www/test/codercto.php pada baris 5
Anda dapat memicu kesalahan di mana pun dalam skrip, dan dengan menambahkan parameter kedua, Anda dapat menentukan tingkat kesalahan yang dipicu.
Jenis kesalahan yang mungkin terjadi:
E_USER_ERROR - Kesalahan run-time fatal yang disebabkan oleh pengguna. Kesalahan tidak dapat dipulihkan. Eksekusi skrip terhenti.
E_USER_WARNING - Peringatan run-time yang dibuat pengguna dan tidak fatal. Eksekusi skrip tidak terganggu.
E_USER_NOTICE - Bawaan. Notifikasi run-time yang dibuat pengguna. Terjadi ketika skrip menemukan kemungkinan kesalahan, tetapi dapat juga terjadi ketika skrip berjalan normal.
Dalam contoh ini, jika variabel "test" lebih besar dari "1", kesalahan E_USER_WARNING akan terjadi. Jika E_USER_WARNING terjadi, kami akan menggunakan penangan kesalahan khusus kami dan mengakhiri skrip:
<?php// Fungsi penanganan kesalahan function customError($errno, $errstr){ echo "<b>Kesalahan:</b> [$errno] $errstr<br>"; }//Setel fungsi penanganan kesalahan set_error_handler("customError",E_USER_WARNING);//Memicu kesalahan $test=2;if ($test>1){ trigger_error("Nilai variabel harus kurang dari atau sama dengan 1",E_USER_WARNING);}?>
Output dari kode di atas terlihat seperti ini:
Kesalahan: [512] Nilai variabel harus kurang dari atau sama dengan 1. Akhir skrip
Sekarang kita telah mempelajari cara membuat kesalahan kita sendiri dan cara memicunya, mari kita lihat pencatatan kesalahan.
Secara default, PHP mengirimkan log kesalahan ke sistem atau file logging server, bergantung pada konfigurasi error_log di php.ini. Dengan menggunakan fungsi error_log(), Anda dapat mengirim catatan kesalahan ke file tertentu atau tujuan jarak jauh.
Mengirim pesan kesalahan melalui email kepada diri Anda sendiri adalah cara yang baik untuk mendapatkan pemberitahuan tentang kesalahan tertentu.
Pada contoh di bawah ini, jika terjadi kesalahan tertentu, kami akan mengirimkan email berisi pesan kesalahan dan mengakhiri skrip:
<?php// Fungsi penanganan kesalahan function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr<br>"; error_log ("Kesalahan: [$errno] $errstr",1, "[email protected]","Dari: [email protected]");}// Menyetel fungsi penanganan kesalahan set_error_handler("customError",E_USER_WARNING); // Memicu kesalahan $test=2;if ($test>1){ trigger_error("Nilai variabel harus kurang dari atau sama dengan 1",E_USER_WARNING);} ?>
Output dari kode di atas terlihat seperti ini:
Kesalahan: [512] Nilai variabel harus kurang dari atau sama dengan 1. Administrator situs web telah diberitahu
Email yang diterima dari kode di atas terlihat seperti ini:
Kesalahan: [512] Nilai variabel harus kurang dari atau sama dengan 1
Metode ini tidak cocok untuk semua kesalahan. Kesalahan umum harus dicatat di server menggunakan sistem logging default PHP.