# Global Exception Handler PHP

pada post ini saya akan sharing bagimana caranya membuat ***Global Exception Handler*** pada php.

Global exception handler di sini bisa di artikan sama seperti kita menggunakan *try catch*, namun ini secara global.


```php
function sum($number1, $number2)
{
    if (! is_numeric($number1) && !is_numeric($number2)){
        throw new Exception('number1 dan number 2 harus berupa angka yang valid.');
    }
    return $number1 + $number2;
}

try {
    echo sum('not a number', 'not a number');
} catch (Exception $e) {
    echo $e->getMessage();
 //  output : 'number1 dan number 2 harus berupa angka yang valid. '
}
``` 
perhatikan kode di atas.

saya membuat sebuah function sum, dimana function tersebut akan mengembalikan hasil penjumlahan dari nilai parameter $number1  dan $number2.

di mana sebelum melakukan penjumlahan saya melakukan validasi  terlebih dahulu.
jika $number1 dan $number2 bukan sebuah angka yang valid, maka program melemparkan sebuah object Exception.
nantinya ketika memanggil function *sum* kita menggunakan try catch. dan outputnya adalah  'number1 dan number 2 harus berupa angka yang valid'

lantas, bagaimana jika tidak menggunakan ***try catch*** ?


```php
function sum($number1, $number2)
{
    if (! is_numeric($number1) && !is_numeric($number2)){
        throw new Exception('number1 dan number 2 harus berupa angka yang valid.');
    }
    return $number1 + $number2;
}

echo sum('not a number', 'not a number');
// output : 'PHP Fatal error:  Uncaught Exception: number1 dan number 2 harus berupa angka yang valid. in /home/dhenfie'...
``` 
ternyata jika terdapat exception yang di throw dan tidak tertangkap akan menyebabkan error.

di dalam php terdapat sebuah function [set_exception_handler()](https://www.php.net/manual/en/function.set-exception-handler.php) yang bisa kita gunakan  untuk menangani exception yang tidak tertangkap.

> sedikit catatan. di PHP 7  ke atas ada sedikit perubahan pada internal Error Handling (Penanganan Error).
> di mana sebagian besar Error yang terjadi akan di lempar class Error.  


function *set_exception_handler()* membutuhkan satu parameter berupa callback, di mana ketika terjadi Exception yang tidak tertangkap, callback akan di panggil.

sebagai contoh .
```php
set_exception_handler(function(Throwable $e){
    echo 'Terjadi exception: '. $e->getMessage();
});

function sum($number1, $number2)
{
    if (! is_numeric($number1) && !is_numeric($number2)){
        throw new Exception('number1 dan number 2 harus berupa angka yang valid.');
    }
    return $number1 + $number2;
}

echo sum('not a number', 'not a number');

```

kode di atas akan menampilkan output ''terjadi exception : number1 dan number 2 harus berupa angka yang valid.'

kita juga bisa menampilkan detail Exception

```php
set_exception_handler(function(Throwable $e){
    echo 'Terjadi exception: '. $e->getMessage(). "\n";
    echo 'file : '. $e->getFile(). "\n";
    echo 'line : '. $e->getLine();
});

function sum($number1, $number2)
{
    if (! is_numeric($number1) && !is_numeric($number2)){
        throw new Exception('number1 dan number 2 harus berupa angka yang valid.');
    }
    return $number1 + $number2;
}

echo sum('not a number', 'not a number');
```

karena 'Throwable' adalah sebuah interface dan class Exception adalah implementasinya maka kita bisa memanggil method yang ada di class Exception, seperti getLine(), getMesage() dan lain lain.

oh ya untuk contoh implementasi real dari set_exception_handler() adalah library  [Whoops](https://github.com/filp/whoops). 
**Whoops** sendiri adalah library yang di gunakan untuk menampilkan 'pesan error' yang lebih elegan.

dalam prateknya, Whoops sendiri tidak hanya memanfaatkan function set_exception_handler() tetapi juga fungsi **
[set_error_handler()](https://www.php.net/manual/en/function.set-error-handler.php).

saya juga sempat membuat library serupa namun ini lebih sederhana. repository nya ada github [https://github.com/dhenfie/error-handler](https://github.com/dhenfie/error-handler).

oke mungkin cukup sekian artikel dari saya, semoga bermanfaat.
