Tutorial PHP: Menggunakan Exception Handling

Tutorial PHP: Menggunakan Exception Handling

Tutorial Information

ProgramPHP
Version5.0+
DifficultyPemula
Estimated Time20 menit

PHP5 merupakan suatu perubahan besar dari versi sebelumnya. Perbedaan mencoloknya terletak pada kemampuan OOP (Object Oriented Programming). Salah satu fitur powerful yang ditambahkan, namun…

PHP5 merupakan suatu perubahan besar dari versi sebelumnya. Perbedaan mencoloknya terletak pada kemampuan OOP (Object Oriented Programming). Salah satu fitur powerful yang ditambahkan, namun jarang digunakan adalah Exception Handling. Dengan menggunakan Exception Handling ini, pemrograman dapat menjadi lebih efektif dan efisien.

Pada dasarnya, exception handling ini meminimalisir penggunaan “if” yang berlebihan. Contoh kasusnya adalah misalkan program Anda hendak mendapatkan data user dari database, dengan menggunakan id dari user tersebut. Itu berarti, Anda harus melakukan pengecekan terlebih dahulu apakah id yang dimasukkan adalah numerik atau bukan.

if(!is_numeric($user_id)) {
  // jangan jalankan fungsi
}

Penanganan error semacam inilah yang memunculkan fitur bernama Exception ini. Exception adalah suatu kondisi tertentu, yang biasanya berupa error, yang dapat terjadi atau sengaja dibuat pada program. Exception dapat di-thrown dan di-caught. Ketika Exception di-throw, itu berarti telah terjadi sesuatu yang di luar kewajaran, yang harus dilakukan sesuatu untuk menanganinya. Sedangkan meng-catch Exception berarti menangani sesuatu tersebut pada program. Untuk lebih jelasnya, cobalah langkah berikut ini.

  1. Exception pada dasarnya adalah sebuah object, yang dapat dibuat instance-nya.
    $exception = new Exception('Pesan error');
    throw $exception;
  2. Beberapa method yang dapat dipanggil dari Exception antara lain adalah sebagai berikut:
    • getMessage() – mendapatkan pesan Exception
    • getCode() – mendapatkan kode angka representasi dari Exception
    • getFile() – mendapatkan file tempat terjadinya Exception
    • getLine() – mendapatkan baris tempat terjadinya Exception
    • getPrevious() – mendapatkan Exception sebelumnya bila ada
    • __toString() – mendapatkan Exception sepenuhnya dalam bentuk String
  3. Untuk mengilustrasikan penggunaan Exception ini, buatlah sebuah class User sederhana yang merepresentasikan pengambilan record dari database.
    class User {
      protected $_id;
      protected $_username;
      protected $_email;
    
      public function __construct($user_id) {
        $user_record = self::_get_user_record($user_id);
        $this->_id = $user_record['id'];
        $this->_username = $user_record['username'];
        $this->_email = $user_record['email'];
      }
    
      private static function _get_user_record($user_id) {
        // simulasi pengambilan data dari database
        $user_record = array();
        switch ($user_id) {
          case 1:
            $user_record['id'] = 1;
            $user_record['username'] = 'haqqi';
            $user_record['email'] = 'me@haqqi.net';
            break;
          case 2:
            $user_record['id'] = 2;
            $user_record['username'] = 'mimicreative';
            $user_record['email'] = 'contact@mimicreative.net';
            break;
          case 'error':
            throw new Exception('Error pengambilan data');
            break;
        }
        return $user_record;
      }
    
      // akan diisi pada langkah berikutnya
      public function __get($name) {}
      public function __set($name, $value) {}
    }
  4. Pada class di atas, ada suatu kondisi “exceptional” dapat terjadi. Salah satu contohnya, bila $user_id yang dimasukkan bukan berupa numerik, maka harus dilakukan sesuatu. Biasanya, programmer awam akan menggunakan “if” biasa untuk menanggulanginya. Tapi kali ini, akan dicoba menggunakan Exception. Tambahkan baris berikut pada class User di atas.
      private static function _get_user_record($user_id) {
        $user_id = self::_validate_user_id($user_id);
        ...
        ...
      }
    
      private static function _validate_user_id($user_id) {
        if(!is_numeric($user_id) && $user_id != 'error') {
          throw new Exception('User ID yang dimasukkan tidak sesuai syarat');
        }
        return $user_id;
      }
  5. Berikutnya, cobalah membuat instance dari class tersebut dengan cara biasa seperti berikut.
    $user_1 = new User(1);
    $user_2 = new User('bukan integer');

    Kode di atas akan menghasilkan error, karena exception tersebut belum di-catch. Error yang tampil kurang lebih akan seperti gambar.

    Hasil tampilan error dari PHP tanpa exception handling

  6. Penulisan kode yang lebih baik, adalah dengan meng-catch exception yang terjadi. Format yang digunakan adalah dengan menggunakan blok try-catch.
    try {
      $user_1 = new User(1);
      $user_2 = new User('bukan integer');
    } catch (Exception $e) {
      echo "Terjadi Exception: {$e->getMessage()}";
      echo '<pre>';
      echo $e->getTraceAsString();
      echo '</pre>';
    }

    Kode di atas akan tetap menghasilkan pesan error, karena pada blok “catch” yang dilakukan adalah tetap menampilkan pesan error. Anda bisa mengisinya dengan berbagai fungsi lain untuk menanggulangi error tersebut. Hasil dari kode di atas adalah seperti gambar.

    Tampilan error dengan exception handling default

  7. Anda juga bisa membuat Exception sendiri dengan cara meng-extend class Exception tersebut. Contohnya adalah Anda bisa membuat class UserException seperti berikut:
    class UserException extends Exception {
      const INVALID_ID = 1;
      const INVALID_USERNAME = 2;
      const NOT_EXIST = 10;
    
      public function __construct($error_code) {
        parent::__construct(self::_get_message($error_code), $error_code);
      }
    
      private static function _get_message($error_code) {
        switch ($error_code) {
          case self::INVALID_ID:
            return 'Format user id salah';
            break;
          case self::INVALID_USERNAME:
            return 'Format username salah';
            break;
          case self::NOT_EXIST:
            return 'User tidak ditemukan';
            break;
        }
      }
    }
  8. Setelah itu, fungsi validasi sedikit diubah menjadi seperti berikut:
      private static function _validate_user_id($user_id) {
        if(!is_numeric($user_id) && $user_id != 'error') {
          throw new UserException(UserException::INVALID_ID);
        }
        return $user_id;
      }

    Hasil error yang tampil bisa menggunakan format yang sama seperti sebelumnya, ataupun diubah sesuka Anda. Bila Anda menguasai teknik penyimpanan file, alangkah lebih baiknya bila exception tersebut di-log ke dalam file.

    Tampilan error dengan extending class Exception

  9. Anda juga bisa menambahkan exception bila user yang dicari tidak ditemukan.
      private static function _get_user_record($user_id) {
        ...
        ...
        switch ($user_id) {
          ...
          ...
          default:
            throw new UserException(UserException::NOT_EXIST);
            break;
        }
        return $user_record;
      }
  10. Selamat mencoba.
Artikel ini pernah dipublikasikan oleh Penulis di tabloid PC Mild edisi 20/2011 lalu.
Tag: , , , ,

Write Comment

Your email will not be published. The marked label is required.