Pengecualian yang digunakan untuk mengubah aliran normal script jika terjadi kesalahan tertentu.
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 tertentu (biasa) kondisi 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 yang telah ditetapkan (custom) fungsi handler pengecualian
- Tergantung pada situasi, pawang kemudian dapat melanjutkan eksekusi dari kode negara yang disimpan, menghentikan 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
- Mengatur penangan pengecualian tingkat atas
Catatan: Pengecualian hanya boleh digunakan 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 ini tidak akan dieksekusi, dan PHP akan mencoba untuk menemukan pencocokan “menangkap” blok.
Jika eksepsi tidak tertangkap, kesalahan fatal akan dikeluarkan dengan “Exception tertangkap” pesan.
Mari kita mencoba untuk melemparkan pengecualian tanpa menangkapnya:
<?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:
- Coba – Sebuah fungsi menggunakan pengecualian harus berada dalam “mencoba” blok. Jika pengecualian tidak memicu, kode tersebut akan terus seperti biasa. Namun, jika pengecualian memicu, pengecualian “dilemparkan”
- Lempar – Ini adalah bagaimana Anda memicu pengecualian. Setiap “membuang” harus memiliki setidaknya satu “menangkap”
- Menangkap – A “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:
- The checkNum () fungsi dibuat. Ia memeriksa jika nomor lebih besar dari 1. Jika ya, eksepsi dilemparkan
- The checkNum () fungsi disebut dalam “mencoba” block
- Pengecualian dalam checkNum () fungsi dilemparkan
- The “menangkap” blok retrives pengecualian dan menciptakan objek ($ e) berisi informasi pengecualian
- Pesan kesalahan dari pengecualian bergema dengan menelepon $ e-> getMessage () dari objek pengecualian
Namun, salah satu cara untuk berkeliling “setiap lemparan harus memiliki menangkap” aturan adalah untuk mengatur penangan pengecualian tingkat atas untuk menangani kesalahan yang lolos.
Membuat Kelas Kustom Exception
Membuat handler pengecualian kustom cukup sederhana. Kami hanya 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 tua dengan penambahan errorMessage ( ) function . Karena itu adalah salinan dari kelas lama , dan 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 dengan kelas pengecualian kustom :
- The customException ( ) class dibuat sebagai perpanjangan dari kelas pengecualian tua . Dengan cara ini mewarisi semua metode dan properti dari kelas pengecualian tua
- The errorMessage ( ) fungsi dibuat . Fungsi ini mengembalikan pesan kesalahan jika alamat e -mail tidak valid
- Variabel email $ diatur ke string yang bukan alamat e – mail yang valid
- The ” mencoba ” blok dijalankan dan eksepsi dilemparkan karena alamat e -mail tidak valid
- 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 jika .. lain blok , 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 = “”;
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 perkecualian jika salah satu kondisi tidak terpenuhi:
- The customException () class dibuat sebagai perpanjangan dari kelas pengecualian tua. Dengan cara ini mewarisi semua metode dan properti dari kelas pengecualian tua
- The errorMessage () fungsi dibuat. Fungsi ini mengembalikan pesan kesalahan jika alamat e-mail tidak valid
- Variabel $ email diatur ke string yang merupakan alamat e-mail yang valid, tetapi berisi string “contoh”
- The “mencoba” blok dijalankan dan pengecualian tidak dilempar pada kondisi pertama
- Kondisi kedua memicu pengecualian karena e-mail berisi string “contoh”
- The “menangkap” blok menangkap pengecualian dan menampilkan pesan kesalahan yang benar
Jika pengecualian dilemparkan adalah dari customException kelas dan tidak ada customException menangkap, hanya menangkap dasar pengecualian, pengecualian akan ditangani di sana.
Re-melemparkan 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 skrip 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 membuang-kembali 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 = “”;
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:
- The customException () class dibuat sebagai perpanjangan dari kelas pengecualian tua. Dengan cara ini mewarisi semua metode dan properti dari kelas pengecualian tua
- The errorMessage () fungsi dibuat. Fungsi ini mengembalikan pesan kesalahan jika alamat e-mail tidak valid
- Variabel $ email diatur ke string yang merupakan alamat e-mail yang valid, tetapi berisi string “contoh”
- The “mencoba” blok berisi “mencoba” blok lain untuk membuatnya mungkin untuk kembali membuang-pengecualian
- Pengecualian dipicu karena e-mail berisi string “contoh”
- The “menangkap” blok menangkap pengecualian dan re-melempar “customException”
- The “customException” tertangkap dan menampilkan pesan kesalahan
Jika pengecualian tidak tertangkap dalam arus “mencoba” blok, ia akan mencari blok catch pada “tingkat yang lebih tinggi”.
Mengatur Top Level Exception Handler
The set_exception_handler () fungsi menetapkan fungsi yang ditetapkan pengguna untuk menangani semua pengecualian 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:
pengecualian: Uncaught Exception occurred
Dalam kode di atas tidak ada “menangkap” blok. Sebaliknya, handler pengecualian tingkat atas dipicu. Fungsi ini harus digunakan untuk menangkap pengecualian tidak tertangkap.
Aturan untuk pengecualian
- Kode dapat dikelilingi dalam blok try, untuk membantu menangkap pengecualian potensial
- Masing-masing mencoba blok atau “membuang” harus memiliki minimal satu sesuai blok catch
- Beberapa blok catch dapat digunakan untuk menangkap kelas yang berbeda dari pengecualian
- Pengecualian dapat dibuang (atau re-dilemparkan) dalam blok catch dalam blok try
Sebuah aturan sederhana: Jika Anda melemparkan sesuatu, Anda harus menangkapnya.