PHP Menengah

11. Penanganan Exception

PHP: Penanganan Exception [2/2]

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_WARNINGE_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:

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