Belajar Exception dalam PHP

Ahmad Oriza 27 Maret 2020

Belajar Exception dalam PHP

Kata Exception jika kita terjemahkan kedalam bahasa Indonesia adalah pengecualian. Pengecualian terhadap proses bisnis yang tidak berjalan semestinya, atau apapun yang berada diluar ekspektasi keberhasilan. Ketika ada hal diluar ekspektasi, mau diapakan lagi ini resultnya? mau ditampilkan, mau mengerjakan hal lain, atau mau total stop saja eksekusinya.

Rasanya para programmer baik pemula maupun sudah pengalaman dalam proyek, pastinya sudah pernah menangani pengecualian. Namun memang tidak memanfaatkan fitur Exception dari PHP.

Contoh, seorang programmer membuat program pengiriman Email. Tapi ketika dieksekusi balikan dari fungsi email adalah false / gagal. Lalu ketika false program memberitahu pesan ke user jika email gagal dikirim karena koneksi timeout atau ada from dan to yang tidak diisi. Contoh lain, misal kita membuat suatu fungsi untuk membaca file csv/txt. Kita program sedemikian rupa untuk mengecek file terlebih dahulu, jika filenya not exist, program memberikan pesan file tidak ada.

Mari kita coba lihat contoh program yang menghandle pengecualian tapi tidak menggunakan fitur Exception. Disini ceritanya programmer menggunakan teknik return Boolean :

<?php // Membuat fungsi read, isinya program untuk membaca file baris per baris. function read($file) { $output = null; if (!file_exists($file)) { return false; // Kembalikan false Bool. } $open = fopen($file, "r"); fclose($file); // Tutup koneksi return fread($open, filesize($file)); // Kembalikan output. } $read = read("material.txt"); if ($read == false) { echo 'File tidak ditemukan'; } else { echo $read; } ?>

Bisa dilihat program diatas membuat fungsi sederhana untuk baca suatu file. Jika gagal maka return false, jika berhasil return true. Dalam program tersebut jika material.txt ada maka isinya akan ditampilkan, jika file tidak ada akan mengeluarkan output File tidak ditemukan. Programmer menggunakan teknik return false untuk memberitahu ketidaknormalan.

Pada kasus diatas sebenarnya programmer sudah mengatur pengecualian dengan boolean return. Tentunya kita sering menggunakan teknik ini bukan? Selain bool, array juga biasa dimanfaatkan untuk return ketidaknormalan. Biasanya begini :

return ['status' => false, 'message' => 'File tidak ditemukan'];

Pernah menggunakan CodeIgniter? framework ini banyak menggunakan return array sebagai output. Misalnya saja saat menggunakan library uploader. Kita harus mengambil pesan error dengan method $this->upload->display_errors()

Tidak ada yang salah dengan gaya seperti ini, saya pribadi pun masih suka menerapkan handling seperti ini. Programmer PHP memang jarang menggunakan fitur Exception, tidak seperti C++, Java dll. Kutipan dalam e-book PHPTheRightWay pun dikatakan bahwa programmer PHP banyak mengabaikan fitur Exception.

Mari kita melihat bagaimana jika program tadi kita ubah dengan menerapkan fitur Exception :

<?php error_reporting(E_ALL); ini_set('display_errors', 1); // Membuat fungsi read, isinya program untuk membaca file baris per baris. function read($file) { $output = null; if (!file_exists($file)) { throw new Exception('File tidak ditemukan'); // Throw exception. } $open = fopen($file, "r"); fclose($file); // Tutup koneksi return fread($open, filesize($file)); // Kembalikan output. } $read = read("material.tx"); // Masukan material.tx, harusnya txt, sengaja disalahkan. if ($read == false) { echo 'File tidak ditemukan ..'; } else { echo $read; } ?>

Disitu kita gantikan return Bool / array dengan throw new Exception. Pada instansiasi Exception kita isi dengan parameter konstruktor pesan File tidak ditemukan. Untuk menggunakan fitur ini harus paham dulu OOP. Sekarang coba copy dan jalankan script tersebut di komputer kamu, dan sengajakan masukan file yang salah. Maka output program akan seperti ini :

// Pathnya beda beda ya, saya di folder tersebut
Fatal error: Uncaught Exception: File tidak ditemukan in /var/www/html/lab/exception/index.php:12 Stack trace: #0 /var/www/html/lab/exception/index.php(22): read('material.tx') #1 {main} thrown in /var/www/html/lab/exception/index.php on line 12

Error diatas merupakan Uncaught Exception. Yaitu pesan exception yang tidak ditangkap, dengan begini programmer tau sebelah mana titik yang error. Gaya pesannya memang seperti itu, mirip error dan warning PHP. Lalu selanjutnya pesan error ini harus kita tangkap. Caranya begini :

<?php error_reporting(E_ALL); ini_set('display_errors', 1); // Membuat fungsi read, isinya program untuk membaca file baris per baris. function read($file) { $output = null; if (!file_exists($file)) { throw new Exception('File tidak ditemukan'); // Throw exception. } $open = fopen($file, "r"); fclose($file); // Tutup koneksi return fread($open, filesize($file)); // Kembalikan output. } // Block pada try untuk mengeksekusi program jika normal, sedangkan catch akan mengembalikan jika ada Exception. try { $read = read("material.tx"); echo $read; } catch (Exception $exception) { // Exception pada parameter adalah class type hinting, baca tentang type hinting. // Blok ini akan tereksekusi jika ada Exception. Disini kita instansiasi Exception echo $exception->getMessage(); // Take pesan dengan method getMessage. Build-in di class Exception. } ?>

Maka hasilnya dari error yang gamblang akan berubah menjadi :

File tidak ditemukan

Mudah bukan? memang akan terasa janggal jika belum terbiasa. Jika kamu ingin menjadi PHP programmer yang baik kamu harus mulai menggunakan Exception Class untuk menangani hal semacam ini. Manfaat dari fitur Exception :

Standard Menggunakan gaya handling error seperti ini sudah dipahami programmer sejagat. Jika kamu bekerja sebagai team, akan lebih mudah untuk teman kamu untuk menghandle pengecualian dari source code kamu. Tidak perlu lagi harus mempelajari array atau bool apa yang kamu tulis.

Rapih Jika kamu menerapkan Exeption pada setiap lini kode, maka kode handler error kamu akan semakin rapih, tidak lagi perlu ada custom bool atau array.

Modern Fitur Exception sudah ada sejak versi PHP 5. Sekarang ini sudah PHP 7, kamu masih mau koding dengan cara yang sudah usang? . Di luar sana banyak sekali class/library yang bertebaran, rata rata untuk menggunakan library tersebut kita perlu paham Exception karena mereka sudah menerapkannya. Setidaknya kita tahu paham cara handle errornya. Contohnya saja library Email yang terkenal seperti SwiftMailer