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 yang ditentukan (exceptional) kondisi terjadi. Kondisi ini disebut pengecualian.
Ini adalah apa yang biasanya terjadi ketika sebuah pengecualian dipicu:
- The kode negara saat ini disimpan
- Eksekusi kode akan beralih ke yang telah ditetapkan (custom) fungsi handler pengecualian
- 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
Note: 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 "catch" blok.
Jika eksepsi tidak tertangkap, kesalahan fatal akan diterbitkan dengan "Uncaught Exception" pesan.
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:
- Cobalah - Sebuah fungsi menggunakan pengecualian harus berada dalam "try" blok. Jika pengecualian tidak memicu, kode akan berlanjut seperti biasa. Namun jika pengecualian memicu, eksepsi "thrown"
- Membuang - Ini adalah bagaimana Anda memicu pengecualian. Setiap "throw" harus memiliki setidaknya satu "catch"
- Menangkap - Sebuah "catch" 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:
- The checkNum() function dibuat. Ia memeriksa jika nomor lebih besar dari 1. Jika ya, eksepsi dilemparkan
- The checkNum() fungsi disebut dalam "try" block
- Pengecualian dalam checkNum() function dilemparkan
- The "catch" blok mengambil pengecualian dan menciptakan obyek ($e) yang berisi informasi pengecualian
- Pesan kesalahan dari pengecualian bergema dengan memanggil $e-> getMessage() dari objek pengecualian
Namun, salah satu cara untuk berkeliling "every throw must have a catch" 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 = "[email protected]";
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 tua dengan penambahan errorMessage() fungsi. 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:
- The customException() kelas dibuat sebagai perpanjangan dari kelas pengecualian tua. cara ini mewarisi semua metode dan properti dari kelas pengecualian tua
- The errorMessage() function dibuat. Fungsi ini mengembalikan pesan kesalahan jika alamat e-mail tidak valid
- Variabel $ email diatur ke string yang bukan alamat email yang valid
- The "try" blok dijalankan dan pengecualian dilemparkan karena alamat e-mail tidak valid
- The "catch" 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 = "[email protected]";
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:
- The customException() kelas dibuat sebagai perpanjangan dari kelas pengecualian tua. cara ini mewarisi semua metode dan properti dari kelas pengecualian tua
- The errorMessage() function dibuat. Fungsi ini mengembalikan pesan kesalahan jika alamat e-mail tidak valid
- Variabel $ email diatur ke string yang merupakan alamat email yang valid, tetapi berisi string "example"
- The "try" blok dijalankan dan eksepsi tidak dilempar pada kondisi pertama
- Kondisi kedua memicu pengecualian sejak e-mail berisi string "example"
- The "catch" 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 "catch" 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 = "[email protected]";
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 "example" di dalamnya, jika tidak, pengecualian tersebut kembali dilemparkan:
- The customException() kelas dibuat sebagai perpanjangan dari kelas pengecualian tua. cara ini mewarisi semua metode dan properti dari kelas pengecualian tua
- The errorMessage() function dibuat. Fungsi ini mengembalikan pesan kesalahan jika alamat e-mail tidak valid
- Variabel $ email diatur ke string yang merupakan alamat email yang valid, tetapi berisi string "example"
- The "try" blok berisi lain "try" blok untuk memungkinkan untuk kembali membuang pengecualian
- Pengecualian dipicu karena e-mail berisi string "example"
- The "catch" blok menangkap pengecualian dan re-melempar "customException"
- The "customException" tertangkap dan menampilkan pesan kesalahan
Jika pengecualian tidak terperangkap dalam saat ini "try" blok, itu akan mencari blok catch pada "higher levels" .
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 "catch" 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 "throw" harus memiliki minimal satu yang sesuai blok catch
- Beberapa blok catch dapat digunakan untuk menangkap kelas yang berbeda dari pengecualian
- Pengecualian dapat dibuang (or re-thrown) dalam blok catch dalam blok try
Sebuah aturan sederhana: Jika Anda melempar sesuatu, Anda harus menangkapnya.