Belajar Throwable pada PHP Exception

Ahmad Oriza 30 Maret 2020

Belajar Throwable pada PHP Exception

Semenjak versi 7.0, PHP sudah berbenah meng-improve beberapa fitur dan behaviour nya. Salah satunya adalah Exception ini. Mungkin kamu sudah tidak asing lagi dengan istilah Parse Error, Fatal Error, dan error-error lainnya yang seketika muncul ketika kamu salah koding. Halaman yang mengagetkan ini biasa kita lihat ketika memprogram.

Kalau sebelumnya ketika muncul error seperti demikian kita hanya pasrah dan melakukan debug. Nah, semenjak PHP 7.0 kita bisa injeksi alur errornya dengan cara menangkapnya. Dengan demikian kita bisa membuat halaman error yang lebih friendly, mengubah alur program dengan menjalankan module tertentu, atau hal lainnya.

Mengapa bisa demikian? karena engine PHP utama sudah menggunakan Exception untuk dirinya sendiri. Semua error sekarang merupakan tanggung jawab class Error. Terdapat 2 class utama dalam Exception PHP. Pertama, class Exception (kita sudah praktekkan pada materi sebelumnya) dan kedua adalah class Error. Kedua-duanya menerapkan interface yang bernama Throwable.

Mari kita coba kode berikut ini :

<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); $url = 'https://www.codepolitan.com'; echo file_get_contents($url); ?>

Pastinya kamu sering menggunakan fungsi file_get_contents. Jika kamu jalankan script akan menghasilkan output website Codepolitan. Sekarang mari kita salahkan pemanggilannya, dengan typo :

<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Harusnya file_get_contents. echo file_contents('https://www.codepolitan.com');

Dengan pemanggilan yang typo script akan menghasilkan output error begini :

Fatal error: Uncaught Error: Call to undefined function file_contents() in /var/www/html/lab/exeption/index.php:6 Stack trace: #0 {main} thrown in /var/www/html/lab/exeption/index.php on line 6

Disini mesin PHP mengembalikan output error yang uncaught (tidak terambil). Semenjak PHP 7.0 bunyi pesannya banyak mengatakan kata kunci Uncaught, karena PHP 7.0 sudah menerapkan Exception pada Error. Seperti saya katakan sebelumnya, di PHP 5 error seperti ini hanya untuk dipasrahkan saja dan lakukan debugging.

Tapi di PHP 7.0 bisa kita ubah polanya dengan cara try catch dengan interface Throwable :

<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Kode ini hanya akan berjalan pada PHP 7.0 keatas. // Untuk mencoba kode ini di PHP 4, 5 atau 7 kamu bisa gunakan situs http://sandbox.onlinephpfunctions.com try { echo file_contents('https://www.codepolitan.com'); } catch (Throwable $t) { echo $t->getMessage(); // Or lakukan hal lain. Bla bla. } ?>

Output kode diatas adalah :

Call to undefined function file_contents()

Pada kode catch kita hanya menampilkan output, kamu bisa menambahkan logika lain yang kamu butuhkan saat proyek. Yang barusan kita tangani adalah Fatal Error, disini kamu bisa juga menghandle error mesin PHP lainnya seperti TypeError, ParseError, DivisionByZero, ArithmeticError, dan seterusnya.

Mungkin sebagian dari kamu akan bertanya-tanya, untuk apa mengubah alur error core PHP, atau menangani error yang sudah fatal karena kesalahan programmer sendiri. Harusnya error nya di debug, bukan ditangkap dan diubah alurnya. Lebih masuk akal jika menghandle Exception untuk alur bisnis level proyek sendiri, misal gagal registrasi, gagal login, gagal fetch API, dsb.

Untuk menjawab ini saya akan mencoba menyampaikan contoh lain, perhatikan kode berikut ini :

<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Ceritanya diambil dari POST FORM. // Sengaja kita salahkan value yang seharusnya int menjadi string. $_POST['fee'] = 'SAMPLE WRONG VALUE'; function calculateBonus(string $name, int $fee, int $month) { echo 'Name : ' . $name . '<br/>'; echo 'Bonus : ' . number_format($fee * $month); } calculateBonus('Budi', $_POST['fee'], 12);

Pada kode diatas kita membuat sebuah fungsi yang berguna untuk menghitung jumlah bonus orang, parameternya adalah nama, fee, dan total bulan dia bekerja. Mungkin pada format lain fungsi ini bisa jadi sebuah method dalam sebuah class. Bisa kamu lihat kita menggunakan type hinting pada setiap parameter. Fitur ini berguna untuk memberitahu programmer lain tipe paramater yang diterima. Juga mendisplinkan diri untuk mempassing value yang benar.

Kemudian kamu coba lihat data POST, sengaja kita masukan string untuk parameter fee agar terjadi error. Jika kamu jalankan tanpa try, catch program ini akan menghasilkan fatal error :

Fatal error: Uncaught TypeError: Argument 2 passed to calculateBonus() must be of the type integer, string given, called in /var/www/html/lab/exeption/index.php on line 12 and defined in /var/www/html/lab/exeption/index.php:8 Stack trace: #0 /var/www/html/lab/exeption/index.php(12): calculateBonus('Budi', 'HEHE', 12) #1 {main} thrown in /var/www/html/lab/exeption/index.php on line 8

Potensi ini bisa terjadi jika user tidak memasukan data yang valid. Misalnya datang dari sebuah form. Oke, bagaimana jika sudah divalidasi pada sisi HTML/JS? tetap saja yang namanya validasi harus dilakukan juga di sisi server untuk keamanan data.

Error type hinting ini tidak bisa dihandle dengan melakukan if else seperti biasanya. Jika ingin menghandle error ini wajib menangkap exception dari mesin PHP. Sehingga kodenya harus kita ubah menjadi seperti ini :

<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Ceritanya diambil dari POST FORM. // Sengaja kita salahkan value yang seharusnya int menjadi string. $_POST['fee'] = 'SAMPLE WRONG VALUE'; function calculateBonus(string $name, int $fee, int $month) { echo 'Name : ' . $name . '<br/>'; echo 'Bonus : ' . number_format($fee * $month); } try { calculateBonus('Budi', $_POST['fee'], 12); } catch (Throwable $t) { echo 'Pastikan semua field mengikuti tipe data yang benar.'; } ?>

Output kode diatas adalah :

Pastikan semua field mengikuti tipe data yang benar.

Sekarang output terlihat lebih friendly. Output ini bisa kita jadikan alert dalam bentuk Ajax, ataupun tampilan HTML untuk dibaca oleh user.

Demikian materi tentang Exception Throwable. Semoga kamu bisa memahaminya dengan baik.

Sumber Inspirasi : https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/