Anda di halaman 1dari 12

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.

Disini akan menunjukkan metode penanganan kesalahan yang berbeda:

 Simple "die ()" pernyataan


 kesalahan kustom dan pemicu kesalahan
 pelaporan kesalahan

Dasar Penanganan Kesalahan: Menggunakan die () fungsi

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:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:


No such file or directory in C:\webfolder\test.php on line 2

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:

File not found

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 Kesalahan Handler Kustom

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_file Optional. Specifies the filename in which the error occurred

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

Kesalahan tingkat Report

tingkat laporan kesalahan ini adalah jenis yang berbeda dari kesalahan kesalahan handler yang ditetapkan pengguna
dapat digunakan untuk:

Value Constant Description

2 E_WARNING Non-fatal run-time errors. Execution of the script is not halted

8 E_NOTICE Run-time notices. The script found something that might be an


error, but could also happen when running a script normally

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()

1024 E_USER_NOTICE User-generated notice. This is like an E_NOTICE 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)

Sekarang mari kita membuat fungsi untuk menangani error:

Function customError($errno, $errstr) {


echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}

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.

Set Kesalahan Handler

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";
}

//set error handler


set_error_handler("customError");

//trigger error
echo($test);
?>

Output dari kode di atas harus sesuatu seperti ini:

Error: [8] Undefined variable: test


Memicu Kesalahan

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");
}
?>

Output dari kode di atas harus sesuatu seperti ini:

Notice: Value must be 1 or below


in C:\webfolder\test.php on line 6

Kesalahan bisa dipicu mana saja yang Anda inginkan dalam naskah, dan dengan menambahkan parameter
kedua, Anda dapat menentukan apa tingkat kesalahan dipicu.

Kemungkinan jenis kesalahan:

 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();
}

//set error handler


set_error_handler("customError",E_USER_WARNING);

//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:

Error: [512] Value must be 1 or below


Ending Script

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.

Kirim Pesan Kesalahan oleh E-Mail

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");
}

//set error handler


set_error_handler("customError",E_USER_WARNING);

//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:

Error: [512] Value must be 1 or below


Webmaster has been notified

Dan surat yang diterima dari kode di atas terlihat seperti ini:

Error: [512] Value must be 1 or below

Ini tidak boleh digunakan dengan semua kesalahan. kesalahan biasa harus login server menggunakan sistem
default PHP logging.

PHP Exception Handling

Pengecualian digunakan untuk mengubah aliran normal script jika kesalahan tertentu terjadi.

Apa itu Exception

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:

 kode negara saat ini disimpan


 Eksekusi kode akan beralih ke fungsi handler pengecualian yang telah ditetapkan (custom)
 Tergantung pada situasi, pawang kemudian dapat melanjutkan eksekusi dari kode negara yang disimpan,
mengakhiri eksekusi script atau melanjutkan script dari lokasi yang berbeda dalam kode

Kami akan menunjukkan metode penanganan kesalahan yang berbeda:

 penggunaan dasar Pengecualian


 Membuat handler pengecualian kustom
 beberapa pengecualian
 Re-melempar pengecualian
 Menetapkan pengecualian handler tingkat atas

Catatan: seharusnya hanya digunakan Pengecualian dengan kondisi kesalahan, dan tidak boleh digunakan
untuk melompat ke tempat lain dalam kode pada titik tertentu.

Penggunaan dasar Pengecualian

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".

Mari kita mencoba untuk melemparkan pengecualian tanpa penangkapan itu:

<?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);
?>

Kode di atas akan mendapatkan error seperti ini:

Fatal error: Uncaught exception 'Exception'


with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Coba, melempar dan menangkap

Untuk menghindari kesalahan dari contoh di atas, kita perlu membuat kode yang tepat untuk menangani
pengecualian.

kode pengecualian yang tepat harus mencakup:

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;
}

//trigger exception in a "try" block


try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}

//catch exception
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>

Kode di atas akan mendapatkan error seperti ini:

Message: Value must be 1 or below

Contoh menjelaskan:

Kode di atas melempar pengecualian dan menangkap itu:

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.

Membuat Kelas Exception Kustom

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.

Mari kita membuat kelas pengecualian:

<?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);
}
}

catch (customException $e) {


//display custom message
echo $e->errorMessage();
}
?>

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 (customException $e) {


echo $e->errorMessage();
}

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);
}
}

catch (customException $e) {


//display custom message
echo $e->errorMessage();
}
?>

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".

Set Top Level Exception Handler

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');

throw new Exception('Uncaught Exception occurred');


?>

Output dari kode di atas harus sesuatu seperti ini:

Exception: Uncaught Exception occurred

Dalam kode di atas tidak ada "menangkap" blok. Sebaliknya, tingkat atas pengecualian handler dipicu. Fungsi
ini harus digunakan untuk menangkap pengecualian tidak tertangkap.

Aturan untuk pengecualian


 Kode dapat dikelilingi dalam blok try, untuk membantu menangkap potensi pengecualian
 Setiap mencoba blok atau "membuang" harus memiliki minimal satu yang sesuai blok catch
 Beberapa blok catch dapat digunakan untuk menangkap kelas yang berbeda dari pengecualian
 Pengecualian dapat dibuang (atau kembali dilemparkan) dalam blok catch dalam blok try

Sebuah aturan sederhana: Jika Anda melempar sesuatu, Anda harus menangkapnya.

Anda mungkin juga menyukai