PHP Penanganan Kesalahan
PHP Penanganan Kesalahan
Default error handling di PHP sangat sederhana. Pesan kesalahan dengan nama file, nomor baris dan pesan
yang menjelaskan kesalahan tersebut dikirim ke browser.
Ketika membuat script dan aplikasi web, penanganan kesalahan adalah bagian penting. Jika kode Anda tidak
memiliki kesalahan kode pengecekan, program anda mungkin terlihat sangat tidak profesional dan Anda
mungkin terbuka untuk risiko keamanan.
Contoh pertama menunjukkan sebuah script sederhana yang membuka file teks:
<?php
$file=fopen("welcome.txt","r");
?>
Jika file tidak ada Anda mungkin mendapatkan error seperti ini:
Untuk mencegah pengguna dari mendapatkan pesan kesalahan seperti di atas, kita menguji apakah file tersebut
ada sebelum kita mencoba untuk mengaksesnya:
<?php
if(!file_exists("welcome.txt"))
{
die("FileNotFound");
}else
{
$file=fopen("welcome.txt","r");
}
?>
Sekarang jika file tidak ada Anda mendapatkan error seperti ini:
Kode di atas adalah lebih efisien daripada kode sebelumnya, karena menggunakan mekanisme penanganan
kesalahan yang sederhana untuk menghentikan script setelah kesalahan. Namun, hanya menghentikan script
tidak selalu cara yang tepat untuk pergi. Mari kita lihat fungsi PHP alternatif untuk kesalahan penanganan.
Membuat handler kesalahan kustom cukup sederhana. Kami hanya membuat fungsi khusus yang dapat
dipanggil ketika terjadi kesalahan di PHP.
Fungsi ini harus mampu menangani minimal dua parameter (tingkat kesalahan dan pesan kesalahan) tapi dapat
menerima hingga lima parameter (opsional: berkas, line-nomor, dan konteks error):
Sintaksis
error_function(error_level,error_message, error_file,error_line,error_context)
Parameter Description
error_level Required. Specifies the error report level for the user-defined error. Must be a value number.
See table below for possible error report levels
error_message Required. Specifies the error message for the user-defined error
error_line Optional. Specifies the line number in which the error occurred
error_context Optional. Specifies an array containing every variable, and their values, in use when the
error occurred
tingkat laporan kesalahan ini adalah jenis yang berbeda dari kesalahan kesalahan handler yang ditetapkan pengguna
dapat digunakan untuk:
256 E_USER_ERROR Fatal user-generated error. This is like an E_ERROR set by the
programmer using the PHP function trigger_error()
512 E_USER_WARNING Non-fatal user-generated warning. This is like an
E_WARNING set by the programmer using the PHP function
trigger_error()
4096 E_RECOVERABLE_ERROR Catchable fatal error. This is like an E_ERROR but can be
caught by a user defined handle (see also set_error_handler())
8191 E_ALL All errors and warnings (E_STRICT became a part of E_ALL
in PHP 5.4)
Kode di atas adalah fungsi penanganan kesalahan sederhana. Ketika dipicu, mendapat tingkat kesalahan dan
pesan kesalahan. Kemudian output tingkat kesalahan dan pesan dan berakhir script.
Sekarang kita telah menciptakan fungsi penanganan kesalahan kita perlu memutuskan kapan harus dipicu.
Default error handler untuk PHP adalah dibangun dalam kesalahan handler. Kami akan membuat fungsi di atas
default error handler selama script.
Hal ini dimungkinkan untuk mengubah penangan kesalahan untuk mengajukan hanya beberapa kesalahan, cara
itu script dapat menangani kesalahan yang berbeda dengan cara yang berbeda. Namun, dalam contoh ini kita
akan menggunakan penangan kesalahan kebiasaan kami untuk semua kesalahan:
set_error_handler("customError");
Karena kita ingin fungsi kustom kami untuk menangani semua kesalahan, set_error_handler () hanya
dibutuhkan satu parameter, parameter kedua dapat ditambahkan untuk menentukan tingkat kesalahan.
Contoh
Pengujian penangan kesalahan dengan mencoba untuk variabel output yang tidak ada:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
//trigger error
echo($test);
?>
Dalam naskah di mana pengguna dapat memasukkan data yang berguna untuk memicu kesalahan ketika input
ilegal terjadi. Dalam PHP, hal ini dilakukan oleh trigger_error () fungsi.
Contoh
Dalam contoh ini kesalahan terjadi jika "test" variabel lebih besar dari "1":
<?php
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below");
}
?>
Kesalahan bisa dipicu mana saja yang Anda inginkan dalam naskah, dan dengan menambahkan parameter
kedua, Anda dapat menentukan apa tingkat kesalahan dipicu.
E_USER_ERROR - Fatal user-generated run-time error. Kesalahan yang tidak dapat pulih
dari. Pelaksanaan script dihentikan
E_USER_WARNING - Non-fatal user-generated run-time peringatan. Pelaksanaan script tidak
dihentikan
E_USER_NOTICE - default. run-time pemberitahuan pengguna yang dihasilkan. Script menemukan
sesuatu yang mungkin kesalahan, tetapi juga bisa terjadi saat menjalankan script biasanya
Contoh
Dalam contoh ini merupakan E_USER_WARNING terjadi jika "test" variabel lebih besar dari "1". Jika
E_USER_WARNING terjadi kita akan menggunakan penangan error kebiasaan kami dan mengakhiri script:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
//trigger error
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
Sekarang kita telah belajar untuk membuat kesalahan kita sendiri dan bagaimana memicu mereka, mari kita
lihat di error logging.
kesalahan Logging
Secara default, PHP mengirim log error untuk sistem logging server atau file, tergantung pada bagaimana
konfigurasi error_log diatur dalam file php.ini. Dengan menggunakan error_log () berfungsi Anda dapat
mengirim error log ke file atau tujuan jarak jauh yang ditentukan.
Mengirim pesan kesalahan untuk diri sendiri melalui e-mail dapat menjadi cara yang baik untuk mendapatkan
diberitahu kesalahan tertentu.
Dalam contoh di bawah ini kami akan mengirim e-mail dengan pesan kesalahan dan mengakhiri script, jika
kesalahan tertentu terjadi:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From: webmaster@example.com");
}
//trigger error
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
Output dari kode di atas harus sesuatu seperti ini:
Dan surat yang diterima dari kode di atas terlihat seperti ini:
Ini tidak boleh digunakan dengan semua kesalahan. kesalahan biasa harus login server menggunakan sistem
default PHP logging.
Pengecualian digunakan untuk mengubah aliran normal script jika kesalahan tertentu terjadi.
Dengan PHP 5 datang dengan cara berorientasi objek baru berurusan dengan kesalahan.
Penanganan eksepsi digunakan untuk mengubah aliran normal eksekusi kode jika kesalahan ditentukan kondisi
(biasa) terjadi. Kondisi ini disebut pengecualian.
Ini adalah apa yang biasanya terjadi ketika sebuah pengecualian dipicu:
Catatan: seharusnya hanya digunakan Pengecualian dengan kondisi kesalahan, dan tidak boleh digunakan
untuk melompat ke tempat lain dalam kode pada titik tertentu.
Ketika eksepsi dilemparkan, kode berikut tidak akan dieksekusi, dan PHP akan mencoba untuk menemukan
pencocokan "menangkap" blok.
Jika eksepsi tidak tertangkap, kesalahan fatal akan dikeluarkan dengan pesan "Tertangkap Exception".
<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception
checkNum(2);
?>
Untuk menghindari kesalahan dari contoh di atas, kita perlu membuat kode yang tepat untuk menangani
pengecualian.
1. Cobalah - Sebuah fungsi menggunakan pengecualian harus berada dalam "mencoba" blok. Jika
pengecualian tidak memicu, kode akan berlanjut seperti biasa. Namun jika pengecualian memicu,
eksepsi "dilemparkan"
2. Membuang - Ini adalah bagaimana Anda memicu pengecualian. Setiap "membuang" harus memiliki
setidaknya satu "menangkap"
3. Menangkap - Sebuah "menangkap" blok mengambil pengecualian dan menciptakan sebuah objek yang
berisi informasi pengecualian
Mari kita mencoba untuk memicu pengecualian dengan kode yang valid:
<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//catch exception
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
Contoh menjelaskan:
1. The checkNum () function dibuat. Ia memeriksa jika nomor lebih besar dari 1. Jika ya, eksepsi
dilemparkan
2. The checkNum () fungsi disebut dalam blok "mencoba"
3. Pengecualian dalam fungsi checkNum () dilemparkan
4. The "menangkap" blok mengambil pengecualian dan menciptakan obyek ($ e) yang berisi informasi
pengecualian
5. Pesan kesalahan dari pengecualian bergema dengan memanggil $ e-> getMessage () dari objek
pengecualian
Namun, salah satu cara untuk berkeliling "setiap lemparan harus memiliki menangkap" aturan adalah untuk
menetapkan tingkat atas pengecualian handler untuk menangani kesalahan yang lolos.
Untuk membuat pengecualian kustom handler Anda harus membuat kelas khusus dengan fungsi yang dapat
dipanggil ketika pengecualian terjadi di PHP. kelas harus menjadi perpanjangan dari kelas pengecualian.
Kelas pengecualian kustom mewarisi sifat dari kelas pengecualian PHP dan Anda dapat menambahkan fungsi
kustom untuk itu.
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "someone@example...com";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
}
Kelas baru adalah salinan dari kelas pengecualian lama dengan penambahan fungsi menampilkan pesan
kesalahan (). Karena itu adalah salinan dari kelas lama, dan itu mewarisi properti dan metode dari kelas lama,
kita dapat menggunakan metode kelas pengecualian seperti getline () dan getFile () dan getMessage ().
Contoh menjelaskan:
Kode di atas melempar pengecualian dan menangkap itu dengan kelas pengecualian kustom:
1. The customException () kelas dibuat sebagai perpanjangan dari kelas pengecualian tua. cara ini
mewarisi semua metode dan properti dari kelas pengecualian tua
2. The menampilkan pesan kesalahan () function dibuat. Fungsi ini mengembalikan pesan kesalahan jika
alamat e-mail tidak valid
3. Variabel $ email diatur ke string yang bukan alamat email yang valid
4. The "mencoba" blok dijalankan dan pengecualian dilemparkan karena alamat e-mail tidak valid
5. The "menangkap" blok menangkap pengecualian dan menampilkan pesan kesalahan
beberapa pengecualian
Hal ini dimungkinkan untuk script untuk menggunakan beberapa pengecualian untuk memeriksa beberapa
kondisi.
Hal ini dimungkinkan untuk menggunakan beberapa blok if..else, switch, atau sarang beberapa
pengecualian. pengecualian ini dapat menggunakan kelas eksepsi yang berbeda dan kembali pesan kesalahan
yang berbeda:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "someone@example.com";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE) {
throw new Exception("$email is an example e-mail");
}
}
catch(Exception $e) {
echo $e->getMessage();
}
?>
Contoh menjelaskan:
Kode di atas tes dua kondisi dan melempar pengecualian jika salah satu kondisi tidak terpenuhi:
1. The customException () kelas dibuat sebagai perpanjangan dari kelas pengecualian tua. cara ini
mewarisi semua metode dan properti dari kelas pengecualian tua
2. The menampilkan pesan kesalahan () function dibuat. Fungsi ini mengembalikan pesan kesalahan jika
alamat e-mail tidak valid
3. Variabel $ email diatur ke string yang merupakan alamat email yang valid, tetapi berisi string "contoh"
4. The "mencoba" blok dijalankan dan eksepsi tidak dilempar pada kondisi pertama
5. Kondisi kedua memicu pengecualian sejak e-mail berisi string "contoh"
6. The "menangkap" blok menangkap pengecualian dan menampilkan pesan kesalahan yang benar
Jika pengecualian dilemparkan adalah dari customException kelas dan tidak ada customException menangkap,
hanya dasar pengecualian menangkap, pengecualian akan ditangani di sana.
Re-melempar Pengecualian
Kadang-kadang, ketika eksepsi dilemparkan, Anda mungkin ingin menanganinya berbeda dari cara standar. Hal
ini dimungkinkan untuk melemparkan pengecualian untuk kedua kalinya dalam "menangkap" blok.
Sebuah script harus menyembunyikan kesalahan sistem dari pengguna. kesalahan sistem mungkin penting
untuk coder, tetapi tidak menarik bagi pengguna. Untuk membuat segalanya lebih mudah bagi pengguna Anda
dapat kembali melempar pengecualian dengan pesan user friendly:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "someone@example.com";
try {
try {
//check for "example" in mail address
if(strpos($email, "example") !== FALSE) {
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e) {
//re-throw exception
throw new customException($email);
}
}
Contoh menjelaskan:
Kode di atas tes jika email-address berisi string "contoh" di dalamnya, jika tidak, pengecualian tersebut kembali
dilemparkan:
1. The customException () kelas dibuat sebagai perpanjangan dari kelas pengecualian tua. cara ini
mewarisi semua metode dan properti dari kelas pengecualian tua
2. The menampilkan pesan kesalahan () function dibuat. Fungsi ini mengembalikan pesan kesalahan jika
alamat e-mail tidak valid
3. Variabel $ email diatur ke string yang merupakan alamat email yang valid, tetapi berisi string "contoh"
4. The "mencoba" blok berisi lain "mencoba" blok untuk memungkinkan untuk kembali membuang
pengecualian
5. Pengecualian dipicu karena e-mail berisi string "contoh"
6. The "menangkap" blok menangkap pengecualian dan re-melempar "customException"
7. The "customException" tertangkap dan menampilkan pesan kesalahan
Jika pengecualian tidak terjebak dalam saat ini "mencoba" blok, ia akan mencari blok catch pada "tingkat yang
lebih tinggi".
The set_exception_handler () fungsi menetapkan fungsi yang ditetapkan pengguna untuk menangani semua
pengecualian tidak tertangkap.
<?php
function myException($exception) {
echo "<b>Exception:</b> " . $exception->getMessage();
}
set_exception_handler('myException');
Dalam kode di atas tidak ada "menangkap" blok. Sebaliknya, tingkat atas pengecualian handler dipicu. Fungsi
ini harus digunakan untuk menangkap pengecualian tidak tertangkap.
Sebuah aturan sederhana: Jika Anda melempar sesuatu, Anda harus menangkapnya.