Pengecualian digunakan untuk mengubah aliran normal skrip ketika terjadi kesalahan tertentu.
PHP 5 menyediakan pendekatan berorientasi objek baru untuk penanganan kesalahan.
Penanganan pengecualian digunakan untuk mengubah aliran normal skrip ketika kondisi kesalahan (pengecualian) tertentu terjadi. Situasi ini disebut pengecualian.
Ketika pengecualian dipicu, hal ini biasanya terjadi:
Status kode saat ini disimpan
Eksekusi kode dialihkan ke fungsi pengendali pengecualian yang telah ditentukan sebelumnya (khusus).
Tergantung pada situasinya, prosesor dapat memulai ulang eksekusi kode dari status kode yang disimpan, menghentikan eksekusi skrip, atau melanjutkan eksekusi skrip dari lokasi lain dalam kode.
Kami akan menunjukkan metode penanganan kesalahan yang berbeda:
Penggunaan dasar pengecualian
Buat penangan pengecualian khusus
Beberapa pengecualian
pengecualian lempar kembali
Tetapkan pengendali pengecualian tingkat atas
Catatan: Pengecualian hanya boleh digunakan dalam situasi kesalahan dan tidak boleh digunakan untuk melompat ke lokasi lain dalam kode pada titik tertentu.
Ketika pengecualian dilempar, kode berikut tidak akan terus dieksekusi, dan PHP akan mencoba menemukan blok kode "tangkapan" yang cocok.
Jika pengecualian tidak tertangkap dan tidak ditangani dengan tepat menggunakan set_Exception_handler(), kesalahan serius (kesalahan fatal) akan terjadi dan pesan kesalahan "Pengecualian Tidak Tertangkap" akan ditampilkan.
Mari kita coba melempar pengecualian tanpa menangkapnya:
<?php // Membuat fungsi dengan penanganan pengecualian fungsi checkNum ( $angka ) { jika ( $angka > 1 ) { melemparkan baru Pengecualian ( " Nilai harus 1 atau lebih rendah " ) ; kembali BENAR ; } // memicu pengecualian checkNum ( 2 ) ? >
Kode di atas akan mendapatkan error seperti ini:
Kesalahan fatal: Pengecualian tidak tertangkap 'Pengecualian' dengan pesan 'Nilai harus 1 atau lebih rendah' di /www/codercto/test/test.php:7 Jejak tumpukan: #0 /www/codercto/test/test.php(13): checkNum(2) #1 {main} dimasukkan ke /www/codercto/test/test.php pada baris 7
Untuk menghindari kesalahan yang terlihat pada contoh di atas, kita perlu membuat kode yang sesuai untuk menangani pengecualian.
Kode penanganan pengecualian yang tepat harus mencakup:
Coba - Fungsi yang menggunakan pengecualian harus berada di dalam blok "coba". Jika tidak ada pengecualian yang dipicu, kode akan melanjutkan eksekusi seperti biasa. Namun jika pengecualian dipicu, pengecualian akan dilempar.
Throw - menentukan cara memicu pengecualian. Setiap "lemparan" harus sesuai dengan setidaknya satu "tangkapan".
Catch - Blok "catch" menangkap pengecualian dan membuat objek yang berisi informasi pengecualian.
Mari kita picu pengecualian:
<?php // Membuat fungsi dengan penanganan pengecualian fungsi checkNum ( $angka ) { jika ( $angka > 1 ) { melemparkan baru Pengecualian ( “ Nilai variabel harus kurang dari atau sama dengan 1 ” ) ; kembali BENAR ; } // Memicu pengecualian di blok percobaan mencoba { checkNum ( 2 ) ; // Jika pengecualian dilempar, teks berikut tidak akan ditampilkan gema ' Jika konten ini adalah output, jelaskan variabel $ number ' ; // menangkap pengecualian menangkap ( Pengecualian $e ) { gema ' Pesan: ' . $e -> dapatkan Pesan ( ) ; ?>
Kode di atas akan mendapatkan error seperti ini:
Pesan: Nilai variabel harus kurang dari atau sama dengan 1
Kode di atas memunculkan pengecualian dan menangkapnya:
Buat fungsi checkNum(). Ini mendeteksi apakah angkanya lebih besar dari 1. Jika demikian, berikan pengecualian.
Panggil fungsi checkNum() di blok "coba".
Pengecualian dalam fungsi checkNum() dilempar.
Blok kode "catch" menerima pengecualian dan membuat objek ($e) yang berisi informasi pengecualian.
Keluarkan pesan kesalahan dari pengecualian ini dengan memanggil $e->getMessage() dari objek pengecualian ini.
Namun, untuk mengikuti prinsip "setiap lemparan harus sesuai dengan tangkapan", Anda dapat menyiapkan penangan pengecualian tingkat atas untuk menangani kesalahan yang terlewat.
Membuat penangan pengecualian khusus sangat sederhana. Kami baru saja membuat kelas khusus yang fungsinya dapat dipanggil ketika terjadi pengecualian di PHP. Kelas ini harus merupakan perpanjangan dari kelas pengecualian.
Kelas customException khusus ini mewarisi semua properti kelas pengecualian PHP, dan Anda dapat menambahkan fungsi khusus ke dalamnya.
Kita mulai dengan membuat kelas customException:
<?php kelas pengecualian khusus meluas Pengecualian { publik fungsi pesan kesalahan ( ) { // pesan kesalahan $ errorMsg = ' Nomor baris kesalahan ' . $ this - > getLine ( ) ' dalam ' . $ this - > getFile ( ) ' : <b> ' Alamat E-Mail yang valid ' ; $pesan kesalahan ; } } $email = " [email protected] " ; coba { // Deteksi email jika ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === SALAH ) { // Jika alamat emailnya ilegal, berikan pengecualian melemparkan baru pengecualian khusus ( $ email ) } } menangkap ( pengecualian khusus $e ) { // menampilkan pesan khusus gema $e - > Pesan kesalahan ( ) } ?>
Kelas baru ini adalah salinan dari kelas pengecualian lama, ditambah fungsi errorMessage(). Hanya karena ini adalah salinan dari kelas lama, ia mewarisi properti dan metode dari kelas lama, dan kita dapat menggunakan metode kelas pengecualian, seperti getLine(), getFile(), dan getMessage().
Kode di atas memunculkan pengecualian dan menangkapnya melalui kelas pengecualian khusus:
Kelas customException() dibuat sebagai perpanjangan dari kelas pengecualian lama. Dengan cara ini ia mewarisi semua properti dan metode kelas pengecualian lama.
Buat fungsi errorMessage(). Jika alamat email tidak valid, fungsi ini akan mengembalikan pesan kesalahan.
Setel variabel $email ke string alamat email ilegal.
Blok kode "coba" dijalankan dan pengecualian diberikan karena alamat email tidak valid.
Blok kode "catch" menangkap pengecualian dan menampilkan pesan kesalahan.
Anda dapat menggunakan beberapa pengecualian pada skrip untuk mendeteksi beberapa situasi.
Anda dapat menggunakan beberapa blok kode if..else, atau blok kode saklar, atau membuat beberapa pengecualian. Pengecualian ini dapat menggunakan kelas pengecualian yang berbeda dan mengembalikan pesan kesalahan yang berbeda:
<?php kelas pengecualian khusus meluas Pengecualian { publik fungsi pesan kesalahan ( ) { // pesan kesalahan $ errorMsg = ' Nomor baris kesalahan ' . $ this - > getLine ( ) ' dalam ' . $ this - > getFile ( ) ' : <b> ' Alamat E-Mail yang valid ' ; $pesan kesalahan ; } } $ email = " [email protected] " ; { // Deteksi email jika ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === SALAH ) { // Jika alamat emailnya ilegal, berikan pengecualian melemparkan baru pengecualian khusus ( $ email ) } // Periksa apakah "contoh" ada di alamat email if ( strpos ( $email , " contoh " ) !== SALAH ) { melemparkan baru Pengecualian ( " $email adalah contoh kotak surat " ) ; } menangkap ( pengecualian khusus $e ) { gema $e - > Pesan kesalahan ( ) } menangkap ( Pengecualian $e ) { gema $e - > dapatkan Pesan ( ) } ?>
Kode di atas menguji dua kondisi dan memunculkan pengecualian jika salah satu kondisi tidak benar:
Kelas customException() dibuat sebagai perpanjangan dari kelas pengecualian lama. Dengan cara ini ia mewarisi semua properti dan metode kelas pengecualian lama.
Buat fungsi errorMessage(). Jika alamat email tidak valid, fungsi ini akan mengembalikan pesan kesalahan.
Setel variabel $email ke string yang merupakan alamat email valid tetapi berisi string "contoh".
Jalankan blok kode "coba", dan pada kondisi pertama, tidak ada pengecualian yang akan dilempar.
Karena email berisi string "contoh", kondisi kedua akan memicu pengecualian.
Blok "catch" menangkap pengecualian dan menampilkan pesan kesalahan yang sesuai.
Jika kelas customException memunculkan pengecualian, tetapi customException tidak ditangkap, hanya pengecualian dasar yang ditangkap, pengecualian ditangani di sana.
Terkadang, saat pengecualian muncul, Anda mungkin ingin menanganinya secara berbeda dari standar. Pengecualian dapat dilempar lagi ke blok "tangkap".
Skrip harus menyembunyikan kesalahan sistem dari pengguna. Kesalahan sistem mungkin penting bagi pemrogram, namun pengguna tidak tertarik padanya. Untuk memudahkan pengguna, Anda dapat melemparkan pengecualian lagi dengan pesan yang mudah digunakan:
<?php kelas pengecualian khusus meluas Pengecualian { publik fungsi pesan kesalahan ( ) { // pesan kesalahan $errorMsg = $this -> getMessage ( ) ' Bukan alamat E-Mail yang valid . ' ; kembali $pesan kesalahan ; } } $ email = " [email protected] " ; { mencoba { // Periksa apakah "contoh" ada di alamat email if ( strpos ( $email , " contoh " ) !== SALAH ) { // Jika alamat emailnya ilegal, berikan pengecualian melemparkan baru Pengecualian ( $ email ) } } menangkap ( Pengecualian $e ) { // Menampilkan kembali pengecualian melemparkan baru pengecualian khusus ( $ email ) } } menangkap ( pengecualian khusus $e ) { // Menampilkan informasi khusus gema $e - > Pesan kesalahan ( ) } ?>
Kode di atas mendeteksi apakah string "contoh" terdapat di alamat email. Jika ya, lemparkan pengecualian lagi:
Kelas customException() dibuat sebagai perpanjangan dari kelas pengecualian lama. Dengan cara ini ia mewarisi semua properti dan metode kelas pengecualian lama.
Buat fungsi errorMessage(). Jika alamat email tidak valid, fungsi ini akan mengembalikan pesan kesalahan.
Setel variabel $email ke string yang merupakan alamat email valid tetapi berisi string "contoh".
Blok "coba" berisi blok "coba" lainnya sehingga pengecualian dapat dilempar lagi.
Karena email berisi string "contoh", pengecualian dipicu.
Blok kode "catch" menangkap pengecualian dan memunculkan kembali "customException".
"customException" tertangkap dan pesan kesalahan ditampilkan.
Jika pengecualian tidak tertangkap di blok "coba" saat ini, ia akan mencari blok tangkap di tingkat yang lebih tinggi.
Fungsi set_Exception_handler() menetapkan fungsi yang ditentukan pengguna yang menangani semua pengecualian yang tidak tertangkap.
<?php fungsi myException ( $pengecualian ) { gema " <b>Pengecualian:</b> " , $ pengecualian -> getMessage ( ) } set_Exception_handler ( ' myException ' ) ; baru Pengecualian ( ' Terjadi Pengecualian Tidak Tertangkap ' ) ? >
Output dari kode di atas terlihat seperti ini:
Pengecualian: Terjadi Pengecualian Tidak Tertangkap
Dalam kode di atas, tidak ada blok "tangkap", melainkan pengendali pengecualian tingkat atas yang dipicu. Fungsi ini harus digunakan untuk menangkap semua pengecualian yang tidak tertangkap.
Kode yang memerlukan penanganan pengecualian harus ditempatkan dalam blok percobaan untuk menangkap potensi pengecualian.
Setiap blok coba atau lempar harus memiliki setidaknya satu blok tangkapan yang sesuai.
Gunakan beberapa blok tangkapan untuk menangkap berbagai jenis pengecualian.
Pengecualian dapat dilempar (dilemparkan kembali) ke dalam blok catch di dalam blok try.
Singkatnya: jika pengecualian dilempar, Anda harus menangkapnya.