Pendahuluan
Kemunculan error saat pengembangan suatu aplikasi adalah sesuatu yang tidak-bisa-tidak. Ia pasti terjadi. Bahkan ketika aplikasi/web yang kita kerjakan sudah rilis pun, error tetap menjadi makanan sehari-hari kita. Ia pasti dan harus muncul.
Error apa pun yang muncul, harus ditangani dengan tepat. Baik ketika aplikasi masih dalam pengembangan, lebih-leibh lagi ketika aplikasi telah dilempar ke publik.
Pada pertemuan sebelumnya, kita telah mempelajari tentang error handling. Sedangkan pada pertemuan kali ini, kita akan mempelajari tentang exception handling.
Jika anda pernah belajar bahasa pemrograman lain sebelumnya, mungkin anda kira kedua hal tersebut sama saja. Tapi di PHP, keduanya (dulu) adalah dua hal yang berbeda.
Apa itu Exception?
Exception adalah cara baru untuk menangani error pada PHP. Ia menggunakan pendekatan OOP (Object Oriented Programming) berbeda dengan sebelumnya (versi < 5) yang mana pendekatan yang dilakukan masih prosedural.
Exception secara bahasa berarti pengecualian. Sedangkan secara istilah di dalam PHP, ia adalah sebuah perubahan alur program dari kondisi normal ke kondisi tertentu (atau pengecualian tertentu) jika terjadi suatu error (exception).
Bisa kita katakan: exception adalah bagian kode program yang membutuhkan perlakuan khsusus karena ia berjalan tidak sesuai dengan yang seharusnya.
Exception pertama kali datang pada PHP versi 5 sebagai basis kelas dari semua Exception. Dan sejak PHP versi 7, ia adalah basis kelas untuk semua user-error level [1].
Error Handling vs Exception Handling
Sebelum PHP 7, Error handling dan exception handling bisa dikatakan adalah dua hal yang berbeda. Pada PHP 5, kita bisa menangani error apa pun yang terjadi selama error tersebut tidak sampai level fatal. Sedangkan exception, ia adalah cara baru (di PHP 5) untuk menangani error, akan tetapi fatal error tetap tidak dianggap suatu exception.
Sedangkan setelah rilis PHP versi 7, semua fatal error akan melemparkan sebuah exception yang bisa kita tangkap menggunakan try-catch
[2].
Perlu diperhatikan: beberapa level error seperti E_WARNING
, E_NOTICE
dan sebagainya tidak bisa kita catch karena keduanya bukan merupakan error yang serius.
Untuk membuat error-error “ringan” menjadi error yang dianggap serius, anda bisa menggunakan fungsi set_error_handler
seperti yang telah kita pelajari dalam pertemuan sebelumnya.
Menangani Exception Dengan Try-Catch
Blok kode try .. catch
akan memerintahkan interpreter PHP untuk mencoba mengeksekusi kode program pada blok try, dan jika terjadi suatu exception/error, fungsi catch akan dieksekusi.
Perhatikan contoh berikut:
<?php
try {
echo "Halo bro! <br>";
selamatPagi(); # fungsi tidak pernah didefinisikan
} catch (Exception $error) {
echo "Error: {$error->getMessage()}";
}
Program di atas akan menghasilkan output:
Halo bro!
Error: Call to undefined function selamatPagi()
Membuat dan Melempar Exception Baru
Selain melakukan catching dari error bawaan PHP, kita juga bisa membuat exception kita sendiri dengan meng-override kelas Exception
.
Perhatikan contoh fungsi rerataNilai()
berikut. Kita akan mencoba untuk melempar objek Exception
baru.
<?php
function rerataNilai (array $listNilai) {
if (count($listNilai) < 1) {
# jika array kosong, dia akan melempar objek Exception baru
throw new Exception('Array tidak boleh kosong!');
}
# hitung rata-rata
$total = 0;
foreach ($listNilai as $nilai) {
$total += $nilai;
}
return $total / count($listNilai);
}
Pada fungsi di atas, jika parameter $nilai
adalah array kosong, maka exception baru akan dikembalikan. Sedangkan jika tidak, maka kode program selanjutnya akan dieksekusi.
Kita coba panggil fungsi rerataNilai
dengan memberi parameter array kosong.
<?php
try {
$arrayKosong = [];
# panggil fungsi rerataNilai() dengan parameter array kosong
$rataRata = rerataNilai($arrayKosong);
} catch (Exception $error) {
echo "Error: {$error->getMessage()}";
}
Meng-extends Kelas Exception
Kita juga bisa membuat kelas Exception
baru dengan meng-extends kelas bawaan PHP.
Misalkan kita ingin membuat Exception
dengan nama ParameterFungsiSalahException
. Kita bisa membuatnya seperti berikut:
<?php
class ParameterFungsiSalahException extends Exception {
# kita buat kosongan sehingga kelas ini identik dengan parent-nya
}
Lalu kita bisa melempar exception yang telah kita buat seperti berikut:
<?php
function rerataNilai (array $listNilai) {
if (count($listNilai) < 1) {
# jika array kosong, dia akan melempar objek Exception baru
throw new ParameterFungsiSalahException('Array tidak boleh kosong!');
}
# hitung rata-rata
# ...
}
Multiple Exception
Di dalam PHP, kita bisa menangkap (meng-catch) lebih dari satu exception sekaligus. Hal ini biasa disebut multiple exception.
Untuk melakukannya, kita tinggal menulis blok kode catch {}
berkali-kali.
Perhatikan contoh berikut:
<?php
$a = 5;
$b = 0;
try {
if ($b < 1) {
throw new DivisionByZeroError('Variabel $b tidak boleh 0');
}
echo $a / $b;
} catch (ArgumentCountError $error) {
echo "ArgumentCountError exception: " . $error->getMessage();
} catch (DivisionByZeroError $error) {
echo "DivisionByZeroError exception: " . $error->getMessage();
} catch (Exception $error) {
echo "Exception: " . $error->getMessage();
}
Kode program di atas akan menghasilkan output:
DivisionByZeroError exception: Variabel $b tidak boleh 0
Blok Kode Finally
Selain blok kode try
dan catch
, kita juga bisa menambahkan blok kode finally
. Ia adalah blok kode yang akan senantiasa dieksekusi oleh sistem: baik kode program di dalam blok kode try
berhasil dijalankan mau pun terjadi error.
Perhatikan kode program di bawah:
<?php
try {
# perintah ini tidak menimbulkan error
echo "8 + 10 = " . (8 + 10) . "<br>";
} catch (Exception $error) {
echo "Oops, sepertinya sistem kami sedang error <br>";
} finally {
echo "Aku akan senantiasa dieksekusi <br>";
}
Output:
8 + 10 = 18
Aku akan senantiasa dieksekusi
Kelas Exception Bawaan PHP (Sampai Versi 7.4)
Seiring dengan perkembangannya, PHP sampai versi 7.4 telah datang dengan berbagai macam kelas Exception secara default. Berikut ini daftar exception tersebut:
- Exception
- ErrorException
- Error
- ArgumentCountError
- ArithmeticError
- AssertionError
- DivisionByZeroError
- CompileError
- ParseError
- TypeError
Kesimpulan
Exception adalah cara baru untuk menangani error pada PHP. Ia menggunakan pendekatan OOP (Object Oriented Programming) berbeda dengan sebelumnya (versi < 5) yang mana pendekatan yang dilakukan masih prosedural.
Exception secara bahasa berarti pengecualian. Sedangkan secara istilah di dalam PHP, ia adalah sebuah perubahan alur program dari kondisi normal ke kondisi tertentu (atau pengecualian tertentu) jika terjadi suatu error (exception).
Di dalam PHP, kita bisa menggunakan blok kode try
dan catch
untuk menangani exception yang bersifat fatal. Sedangkan yang tidak fatal: kita bisa menggunakan fungsi set_error_handler()
seperti yang telah kita pelajari pada pertemuan sebelumnya.
Pembahasan Selanjutnya
Pada pertemuan selanjutnya, insyaallah kita akan membahas cara mengelola (membaca dan menulis) file dengan bahasa pemrograman PHP.
Referensi
[1] https://www.php.net/manual/en/class.exception - diakses tanggal 4 Maret 2020
[2] https://dev.to/anastasionico/good-practices-handling-error-and-exceptions-in-php-5d8c - diakses tanggal 4 Maret 2020