Pengelolaan Eksepsi PHP
- Halaman Sebelumnya Error PHP
- Halaman Berikutnya Filter PHP
Eksepsi (Exception) digunakan untuk mengubah alur normal skrip saat terjadi kesalahan tertentu.
Apa itu eksepsi?
PHP 5 menyediakan metode penanganan kesalahan baru yang berorientasi objek.
Penanganan eksepsi digunakan untuk mengubah alur normal skrip saat terjadi kesalahan (eksepsi) tertentu. Situasi ini disebut eksepsi.
Ketika eksepsi dijalankan, biasanya terjadi:
- Keadaan kode saat ini disimpan
- Eksekusi kode dialihkan ke fungsi penangan eksepsi yang diatur sebelumnya
- Dalam beberapa situasi, penangan kesalahan dapat memulai ulang eksekusi kode dari keadaan kode yang disimpan, menghentikan eksekusi skrip, atau melanjutkan eksekusi kode dari tempat lain
Kami akan menunjukkan berbagai metode penanganan kesalahan:
- Penggunaan dasar eksepsi
- Buat penangan eksepsi khusus
- Beberapa eksepsi
- Lempar ulang eksepsi
- Atur penangan eksepsi tingkat tinggi
Penggunaan dasar eksepsi
Ketika eksepsi dijalankan, kode setelahnya tidak akan terus berlanjut, PHP akan mencoba mencari blok kode "catch" yang cocok.
Jika eksepsi belum ditangkap dan tidak menggunakan set_exception_handler() untuk menanggapi, maka akan terjadi kesalahan yang serius (kesalahan fatal) dan pesan kesalahan "Uncaught Exception" (eksepsi yang belum ditangkap) akan dioutputkan.
Biarkan kami coba mengeksripsi eksepsi tanpa menangkapnya:
<?php //buat fungsi dengan eksepsi function checkNum($number) { if($number>1) { throw new Exception("Nilai harus 1 atau di bawah"); } return true; } //trigger exception checkNum(2); ?>
Kode di atas akan mendapatkan kesalahan seperti ini:
Error fatal: Eksepsi yang belum diambil 'Exception' dengan pesan 'Nilai harus 1 atau di bawah' di C:\webfolder\test.php:6 Tumpukan trace: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} dijadikan eksepsi di C:\webfolder\test.php di baris 6
Try, throw dan catch
Untuk menghindari kesalahan seperti contoh di atas, kita perlu membuat kode yang sesuai untuk menangani eksepsi.
Program yang benar harus termasuk:
- Coba - Fungsi yang mengalami eksepsi harus berada di dalam blok kode "try". Jika tidak terjadi eksepsi, kode akan terus berlanjut seperti biasa. Namun, jika eksepsi diaktifkan, akan terjadi eksepsi.
- Throw - Disini ditentukan bagaimana exception dapat dipicu. Setiap "throw" harus memiliki setidaknya satu "catch"
- Catch - Blok kode "catch" akan menangkap exception dan membuat objek yang mengandung informasi exception
Ayo memicu exception:
<?php //Membuat fungsi yang dapat memanggil exception function checkNum($number) { if($number>1) { throw new Exception("Nilai harus 1 atau di bawah"); } return true; } //Pemanggilan exception di blok kode "try" try { checkNum(2); //Jika exception di抛出, teks ini tidak akan ditampilkan echo 'Jika Anda melihat ini, angka adalah 1 atau di bawah'; } //Penangkapan exception catch(Exception $e) { echo 'Pesan: ' .$e->getMessage(); } ?>
Kode di atas akan mendapatkan kesalahan seperti ini:
Pesan: Nilai harus 1 atau di bawah
Pengertian contoh:
Kode di atas mengangkat dan menangkap exception:
- Membuat fungsi checkNum(). Ini mengecek apakah angka lebih besar dari 1. Jika iya, maka mengangkat exception.
- Panggil fungsi checkNum() di blok kode "try".
- Exception di fungsi checkNum() di抛出
- Blok kode "catch" menerima exception ini dan membuat objek yang mengandung informasi exception ($e).
- Dengan memanggil $e->getMessage() dari objek exception, keluaran adalah pesan error dari exception.
Namun, untuk mengikuti prinsip "setiap throw harus memiliki catch", Anda dapat mengatur penanganan exception tingkat tinggi untuk memproses kesalahan yang diabaikan.
Membuat kelas Exception khusus
Membuat penanganan exception khusus sangat mudah. Kita hanya membuat kelas khusus, yang dapat dipanggil fungsi-fungsi saat terjadi exception di PHP. Kelas ini harus menjadi ekspansi kelas exception.
Kelas exception yang dibuat ini mewarisi semua properti kelas exception PHP, Anda dapat menambahkan fungsi khusus.
Kami mulai membuat kelas exception:
<?php class customException extends Exception { public function errorMessage() { //pesan kesalahan $errorMsg = 'Kesalahan di baris '.$this->getLine().' di '.$this->getFile() ': <b>'.$this->getMessage().'</b> bukan alamat surel yang valid'; return $errorMsg; } } $email = "someone@example...com"; try { //cek jika if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //lempar eksepsi jika surel tidak sah throw new customException($email); } } catch (customException $e) { //tampilkan pesan kustom echo $e->errorMessage(); } ?>
Kelas baru ini adalah salinan kelas exception yang lama, ditambahkan dengan fungsi errorMessage(). Karena ia adalah salinan kelas yang lama, ia mewarisi atribut dan metode dari kelas yang lama, sehingga kita dapat menggunakan metode kelas exception, seperti getLine(), getFile(), dan getMessage().
Pengertian contoh:
Kode di atas memicu eksepsi dan ditangkap melalui kelas exception yang disesuaikan:
- Kelas customException dibuat sebagai ekspansi kelas exception lama. Dengan demikian, ia mewarisi semua properti dan metode kelas lama.
- Buat fungsi errorMessage(). Jika alamat surel tidak sah, fungsi ini mengembalikan pesan kesalahan
- Tetapkan variabel $email menjadi string alamat surel yang tidak sah
- Eksekusi blok kode "try", karena alamat surel tidak sah, eksepsi akan dilempar
- Blok kode "catch" menangkap eksepsi dan menampilkan pesan kesalahan
Beberapa eksepsi
Dapat digunakan beberapa eksepsi untuk suatu skrip, untuk mengecek berbagai situasi.
Dapat digunakan beberapa blok kode if..else, atau blok kode switch, atau mengecek beberapa eksepsi. Eksepsi ini dapat menggunakan kelas exception yang berbeda dan mengembalikan pesan kesalahan yang berbeda:
<?php class customException extends Exception { public function errorMessage() { //pesan kesalahan $errorMsg = 'Kesalahan di baris '.$this->getLine().' di '.$this->getFile() ': <b>'.$this->getMessage().'</b> bukan alamat surel yang valid'; return $errorMsg; } } $email = "someone@example.com"; try { //cek jika if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //lempar eksepsi jika surel tidak sah throw new customException($email); } //cek untuk "example" di alamat surel if(strpos($email, "example") !== FALSE) { throw new Exception("$email adalah e-mail contoh"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Pengertian contoh:
Kode di atas menguji dua kondisi, jika keduanya tidak terpenuhi, eksepsi akan dilempar:
- Kelas customException dibuat sebagai ekspansi kelas exception lama. Dengan demikian, ia mewarisi semua properti dan metode kelas lama.
- Buat fungsi errorMessage(). Jika alamat surel tidak sah, fungsi ini mengembalikan pesan kesalahan.
- Eksekusi blok kode "try", di kondisi pertama, tidak akan memicu eksepsi.
- Karena e-mail mengandung string "example", kondisi kedua akan memicu eksepsi.
- Blok kode "catch" akan menangkap eksepsi dan menampilkan pesan kesalahan yang sesuai
Jika customException tidak ditangkap, tapi hanya base exception yang ditangkap, lakukan penanganan eksepsi di sana.
Lempar ulang eksepsi
Kadang-kadang, ketika suatu eksepsi di lempar, Anda mungkin ingin menangani nya dengan cara yang berbeda dari standar. Eksepsi dapat dilempar kembali di dalam blok kode "catch".
Skrip harus menyembunyikan kesalahan sistem bagi pengguna. Kesalahan sistem mungkin penting bagi para pemrogram, tetapi pengguna tidak menaruh perhatian padanya. Agar pengguna dapat menggunakan dengan mudah, Anda dapat melempar kembali eksepsi dengan pesan yang ramah bagi pengguna:
<?php class customException extends Exception { public function errorMessage() { //pesan kesalahan $errorMsg = $this->getMessage().' adalah alamat surel yang tidak sah.'; return $errorMsg; } } $email = "someone@example.com"; try { try { //cek untuk "example" di alamat surel if(strpos($email, "example") !== FALSE) { //lempar eksepsi jika surel tidak sah throw new Exception($email); } } catch(Exception $e) { //lempar kembali eksepsi throw new customException($email); } } catch (customException $e) { //tampilkan pesan kustom echo $e->errorMessage(); } ?>
Pengertian contoh:
Kode di atas memeriksa apakah string "example" ada di alamat surel. Jika ada, eksepsi di-lempar kembali:
- Kelas customException dibuat sebagai ekspansi kelas exception lama. Dengan demikian, ia mewarisi semua properti dan metode kelas lama.
- Buat fungsi errorMessage(). Jika alamat surel tidak sah, fungsi ini mengembalikan pesan kesalahan.
- Atur variabel $email menjadi alamat surel yang valid, tetapi mengandung string "example".
- Blok kode "try" mengandung blok kode "try" lainnya, sehingga eksepsi dapat dilempar kembali.
- Karena alamat surel mengandung string "example", eksepsi diaktifkan.
- "catch" menangkap eksepsi dan melempar kembali "customException".
- Menangkap "customException" dan menampilkan pesan kesalahan.
Jika eksepsi di blok kode try saat ini belum dicatch, maka akan mencari blok kode catch di tingkat yang lebih tinggi.
Pengaturan Penanganan Eksepsi Tingkat Tinggi (Top Level Exception Handler)
Fungsi set_exception_handler() dapat menetapkan fungsi pengguna yang ditetapkan untuk menangani semua eksepsi yang belum dicatch.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
Output kode di atas seharusnya seperti ini:
Exception: Uncaught Exception occurred
Dalam kode di atas, tidak ada blok kode catch, tetapi program penanganan eksepsi tingkat tinggi diaktifkan. Harus menggunakan fungsi ini untuk menangkap semua eksepsi yang belum dicatch.
Aturan eksepsi
- Kode yang perlu dihandle eksepsi harus disimpan di dalam blok kode try, untuk dapat menangkap eksepsi yang potensial.
- Setiap blok kode try atau throw harus memiliki setidaknya satu blok kode catch yang sesuai.
- Dengan menggunakan beberapa blok kode catch, eksepsi yang berbeda dapat dicatch.
- Eksepsi dapat di抛出(re-thrown)kembali di blok kode catch dalam blok kode try.
Dengan demikian: Jika terjadi eksepsi, maka harus dicatch.
- Halaman Sebelumnya Error PHP
- Halaman Berikutnya Filter PHP