Exception PHP

Salah satu cara untuk memproses error adalah dengan menggunakan exception.

Istilah exception baru ada di PHP versi 5.

Exception adalah sebuah kondisi yang akan menyebabkan error. Exception bisa diproses menggunakan try, throw dan catch statement. Code try, throw dan catch statement bekerja dalam urutan sebagai berikut:

  1. Terjadi Exception.
  2. Script yang sedang berjalan dihentikan sementara.
  3. Tergantung dari kondisi error yang akan terjadi, code try, throw dan catch statement akan melanjutkan script, menghentikan script atau melanjutkan script dari lokasi yang berbeda.

Syntax

try {
    // Bagian ini diisi code yang memiliki kemungkinan error
    throw new Exception("Pesan jika terjadi exception");
} catch (Exception $e) {
    // Code yang akan dijalankan jika catch statement dijalankan.
};

Pada bagian try statement diisi dengan code yang memiliki kemungkinan terjadinya exception (error). Jika terjadi exception maka throw statement akan dijalankan untuk melemparkan exception tersebut.

Jika throw statement dijalankan maka catch statement dijalankan untuk menangkap exception yanng dilemparkan oleh throw statement.

Data exception yang dilemparkan oleh throw statement disimpan di dalam sebuah object bernama [$e].

Pesan error exception ditampilkan menggunakan code echo $e->getMessage().

Exception dasar

Perhatikan contoh dasar penggunaan code try, throw dan catch statement berikut ini:

Code PHP 1:

<?php
try {
    $tes_angka = 4;

    if($tes_angka > 3) {
        throw new Exception("Angka yang dimasukkan tidak boleh lebih besar dari 3");
    };

    //Jika throw dijalankan, maka tulisan berikut tidak ditampilkan
    echo 'Jika kamu melihat pesan ini artinya angka yang dimasukkan adalah 3 atau lebih kecil dari 3';
} catch(Exception $e) {
    echo 'Pesan: ' . $e->getMessage();
};
?>

Hasil code PHP 1:

Pesan: Angka yang dimasukkan tidak boleh lebih besar dari 3

Sebagai contoh kita membuat script yang membutuhkan sebuah input angka. Jika angka yang dimasukkan lebih dari 3 maka script tersebut akan error.

Pada contoh di atas, variable $tes_angka tidak boleh berisi angka lebih besar dari 3. Jika variabel $tes_angka berisi angka lebih besar dari 3 maka exception akan terjadi dan throw statement dijalankan.

Pada contoh di atas, variable $tes_angka berisi angka 4 yang artinya terjadi exception (error). Karena exception terjadi maka throw statement dijalankan untuk melemparkan exception tersebut.

Setelah throw statement dijalankan lalu catch statement dijalankan untuk menangkap exception yang dilemparkan. Data exception yang ditangkap oleh catch statement kemudian disimpan di dalam object $e.

Karena catch statement dijalankan maka semua code yang ada di dalam catch statement dijalankan. Code yang berada di dalam catch statement adalah code yang menampilkan pesan error yang dibuat di throw exception.

Class Exception

Exception sebenarnya adalah sebuah class yang secara default sudah ada di PHP. Berikut ini adalah susunan class Exception:

<?php
class Exception
{
    protected $message = 'Unknown exception';   // exception message
    private   $string;                          // __toString cache
    protected $code = 0;                        // user defined exception code
    protected $file;                            // source filename of exception
    protected $line;                            // source line of exception
    private   $trace;                           // backtrace
    private   $previous;                        // previous exception if nested exception

    public function __construct($message = null, $code = 0, Exception $previous = null);

    final private function __clone();           // Inhibits cloning of exceptions.

    final public  function getMessage();        // message of exception
    final public  function getCode();           // code of exception
    final public  function getFile();           // source filename
    final public  function getLine();           // source line
    final public  function getTrace();          // an array of the backtrace()
    final public  function getPrevious();       // previous exception
    final public  function getTraceAsString();  // formatted string of trace

    // Overrideable
    public function __toString();               // formatted string for display
}
?>

Lihat susunan class Exception lebih lengkap di web php.net.

Ada beberapa method dari class Exception yang bisa kita manfaatkan dan kombinasikan dengan try, throw dan catch statement untuk memproses error. Diantaranya yaitu:

Method Penjelasan
getMessage() Menghasilkan pesan exception.
getCode() Menghasilkan code exception. Code exception berguna dalam exception log.
getFile() Menghasilkan nama file penyebab exception.
getLine() Menghasilkan nomor baris tempat exception terjadi.
getTrace() Melacak urutan lokasi exception dan dilaporkan dalam bentuk array.
getTraceAsString() Melacak urutan lokasi exception dan dilaporkan dalam bentuk string.

Perhatikan contoh berikut ini:

Code PHP 2:

<?php
try {
    $tes_angka = 4;

    if($tes_angka > 3) {
        throw new Exception("Angka yang dimasukkan tidak boleh lebih besar dari 3");
    };

    //Jika throw dijalankan, maka tulisan berikut ini tidak ditampilkan
    echo 'Jika kamu melihat pesan ini artinya angka yang dimasukkan adalah 3 atau lebih kecil dari 3';
} catch(Exception $e) {
    echo "Pesan: " . $e->getMessage() . "<br />";
    echo "File: " . $e->getFile() . "<br />";
    echo "Line: " . $e->getLine() . "<br />";
    echo "Trace: " . $e->getTraceAsString() . "<br />";
};
?>

Hasil code PHP 2:

Pesan: Angka yang dimasukkan tidak boleh lebih besar dari 3
File: folder_path\tes.php
Line: 7
Trace: #0 {main}

Berdasarkan contoh di atas kita bisa mendapatkan keterangan error yang lebih lengkap dan sesuai dengan keinginan kita.

Code getMessage() adalah method dari class Exception yang berguna untuk menampilkan pesan exception. Untuk menjalankan method getMessage() kita membutuhkan syntax $nama_object->nama_method().

Pada contoh di atas, $e adalah object yang secara otomatis dibuat berdasarkan class Exception saat catch statement dijalankan.

Method getFile() adalah method yang berguna untuk memberikan nama file tempat terjadinya exception.

Method getLine() berguna untuk melacak pada baris ke berapa terjadi exception.

Method getTraceAsString() berguna untuk melacak urutan tempat terjadinya exception secara lebih detail bila code yang digunakan sangat rumit dan bertingkat.

Melacak exception

Pada code yang bertingkat dan rumit akan sangat sulit dalam melacak lokasi terjadinya exception. Untuk memudahkan kita dalam melacak exception maka kita bisa menggunakan method getTraceAsString().

Code PHP 3:

<?php
function satu() {
    throw new Exception('Pesan dari satu().');
}

function dua() {
    satu();
}

try {
    dua();
} catch (Exception $e) {
    echo "Trace: " . $e->getTraceAsString() . "<br />";
};
?>

Hasil code PHP 3:

Trace: #0 folder_path\tes.php(7): satu() #1 folder_path\tes.php(11): dua() #2 {main}

Pada contoh di atas kita memiliki code yang sedikit rumit yaitu function bertingkat. Berikut ini adalah penjelasan contoh di atas:

  1. Function dua() dijalankan di dalam try statement.
  2. Function dua() akan menjalankan function satu().
  3. Saat function satu() dijalankan, throw statement dieksekusi untuk melemparkan exception yang terjadi.
  4. Code catch statement dijalankan untuk menangkap exception yang dilemparkan oleh throw statement.
  5. Method getTraceAsString() dijalankan untuk mengetahui sumber terjadinya exception.

Berdasarkan hasil yang didapatkan oleh method getTraceAsString() maka kita bisa mengetahui bahwa exception terjadi di dalam function satu() dan sebelum masuk ke function satu() ada function dua() terlebih dahulu.

Membuat class turunan dari class Exception

Karena Exception adalah sebuah class maka kita bisa membuat class turunan dari class Exception.

Salah satu manfaat membuat class turunan dari class Exception adalah kita bisa lebih memodifikasi pesan error yang ingin kita perlihatkan kepada visitor. Perhatikan contoh berikut ini:

Code PHP 4:

<?php
class exception_buatan extends Exception {
    public function pesan_error_buatan() {
        //Pesan error
        $pesan_error = 'Error pada baris: '.$this->getLine().' dalam file: '.$this->getFile() . ': Email ' . $this->getMessage() . ' tidak valid';
        return $pesan_error;
    }
}

$email = "saya@bangjujucom";

try {
    // Validasi email
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
        // Jalankan throw statement jika email tidak valid
        throw new exception_buatan($email);
    }
}

catch (exception_buatan $e) {
    // Tampilkan pesan error
    echo $e->pesan_error_buatan();
}
?>

Hasil code PHP 4:

Error pada baris: 16 dalam file: folder_path\tes.php: Email saya@bangjujucom tidak valid

Pada code di atas kita menggunakan filter_var() function untuk memvalidasi input email. Jika format dari input email tidak sesuai dengan standar format email maka throw statement akan dijalankan.

Lebih dari satu exception

Satu buah exception yang dilemparkan oleh throw statement harus ditangkap oleh oleh satu buah catch statement. Bila ada dua exception maka harus ada dua catch statement dan seterusnya.

Code PHP 5:

<?php
class exception_buatan extends Exception {
    public function pesan_error_buatan() {
        //Pesan error
        $pesan_error = 'Error pada baris: '.$this->getLine().' dalam file: '.$this->getFile() . ': Email ' . $this->getMessage() . ' tidak valid';
        return $pesan_error;
    }
}

$email = "saya@contoh.com";

try {
    // Validasi email
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
        // Jalankan throw statement jika email tidak valid
        throw new exception_buatan($email);
    }

    // Memeriksa kata [contoh] di dalam email
    if(strpos($email, "contoh") !== FALSE) {
        throw new Exception("Ada kata contoh di dalam alamat email");
    }
}
catch (exception_buatan $e) {
    // Tampilkan pesan error
    echo $e->pesan_error_buatan();
}
catch(Exception $e) {
    echo $e->getMessage();
}
?>

Hasil code PHP 5:

Ada kata contoh di dalam alamat email

Code strpos() function di atas berguna untuk mencari posisi sebuah substring yang paling pertama ditemukan di dalam sebuah string (case sensitive).

Pada contoh di atas kita membuat dua exception. Exception pertama terjadi bila input email tidak valid dan exception kedua terjadi bila pada alamat email ada kata contoh.

Exception pertama menggunakan class exception_buatan dan exception kedua menggunakan class Exception.

Pada contoh di atas, input email sudah sesuai dengan format alamat email standar sehingga exception tidak terjadi dan throw statement pertama diabaikan.

Namun pada input email ada kata [contoh] yang menyebabkan exception kedua terjadi dan throw statement kedua dijalankan. Kemudian exception yang dilemparkan oleh throw statement ditangkap oleh catch statement kedua.

Berdasarkan contoh di atas:

  1. Bila exception yang dilemparkan oleh throw statement adalah class exception_buatan maka exception tersebut harus ditangkap oleh catch statement yang menggunakan class exception_buatan.
  2. Sebaliknya, bila exception yang dilemparkan oleh throw statement adalah class Exception maka exception tersebut harus ditangkap oleh catch statement yang menggunakan class Exception.

Perhatikan contoh berikut ini:

  1. Bila exception dilemparkan oleh code [throw new Exception_A()] maka exception tersebut harus ditangkap oleh code catch(Exception_A $e).
  2. Sedangkan bila exception dilemparkan oleh code [throw new Exception_B()] maka exception tersebut harus ditangkap oleh code catch(Exception_B $e).

Re-throw Exception

Re-throw Exception atau melempar ulang exception adalah salah satu alternatif dalam memperlakukan sebuah exception.

Dengan cara ini kita bisa menyembunyikan pesan error yang dibuat oleh system dan memberikan pesan error yang telah dimodifikasi kepada user.

Code PHP 6:

<?php
class exception_buatan extends Exception {
    public function pesan_error_buatan() {
        // Pesan error
        $pesan_error = $this->getMessage() . ' bukan alamat email yang valid.';
        return $pesan_error;
    }
}

$email = "saya@emailcom";

try {
    try {

        // Validasi email
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
            // Jalankan throw statement jika email tidak valid
            throw new Exception($email);
        }

    }
    catch(Exception $e) {
        // Re-throw exception
        throw new exception_buatan($email);
    }
}

catch (exception_buatan $e) {
    // Menampilkan pesan buatan
    echo $e->pesan_error_buatan();
}
?>

Hasil code PHP 6:

saya@emailcom bukan alamat email yang valid.
  1. Class exception_buatan adalah class turunan dari class Exception. Sebagai class turunan, class exception_buatan mewarisi semua property dan method dari class Exception.
  2. Method pesan_error_buatan() dibuat memberikan pesan error jika input alamat email tidak valid.
  3. Di dalam try statement kita masukkan code try, throw dan catch statement.
  4. Jika alamat email tidak valid maka code [throw new Exception] akan dijalankan untuk melemparkan exception. Exception yang dilemparkan oleh [throw new Exception] akan ditangkap oleh code [catch(Exception $e)].
  5. Exception yang ditangkap oleh [catch(Exception $e)] dilemparkan kembali oleh [throw new exception_buatan].
  6. Exception yang dilemparkan oleh [throw new exception_buatan] kemudian ditangkap oleh [catch (exception_buatan $e)].
  7. Method pesan_error_buatan() dijalankan.

set_exception_handler() function

Bila tidak ada catch statement untuk menangkap exception yang dilemparkan maka fatal error akan terjadi.

Code set_exception_handler() function berguna untuk menentukan function yang akan memproses exception yang tidak tertangkap.

Code PHP 7:

<?php
function exception_utama($exception) {
    echo "<b>Exception:</b> " . $exception->getMessage();
}

set_exception_handler('exception_utama');

throw new Exception('Exception tidak tertangkap');
?>

Hasil code PHP 7:

Exception: Exception tidak tertangkap

Pada code di atas kita membuat exception_utama() function untuk memproses exception yang tidak tertangkap.

Supaya PHP mengetahui bahwa exception_utama() function di atas dibuat untuk memproses exception yang tidak tertangkap maka kita menggunakan set_exception_handler() function. Cukup masukkan nama exception_utama() function ke dalam set_exception_handler() function.

Menggunakan set_exception_handler() function menyebabkan script berhenti. Jika kamu ingin script dilanjutkan setelah terjadi exception, gunakan try, throw dan catch statement dan jangan gunakan set_exception_handler() function.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>