Penggunaan fungsi ASERTION pada PHP

Indonesian (Bahasa Indonesia) translation by Hisman Saputra (you can also view the original English article)

Di posting ini, Kamu akan mempelajari bagaimana menggunakan penanganan exception di PHP. Mulai dari PHP5, kita dapat menggunakan blok try catch untuk penanganan error—ini adalah cara yang lebih baik untuk menangani exception dan mengontrol alur dari aplikasimu. Di artikel ini, kita akan membahas dasar-dasar dari penanganan exception beserta dengan beberapa contoh di dunia nyata.

Apa itu Exception?

PHP 5 memperkenalkan model error baru yang memungkinkan Kamu untuk melempar dan menangkap exception di aplikasimu—ini adalah cara yang lebih baik untuk menangani error daripada apa yang kita punya di versi PHP terdahulu. Semua exception merupakan instance dari base class Exception, yang dapat kita kembangkan untuk mengenalkan exception kustom kita sendiri.

Perlu diperhatikan bahwa penanganan exception itu berbeda dengan penanganan error. Di penanganan error, kita dapat menggunakan fungsi set_error_handler untuk mengatur penanganan error kustom kita sehingga ketika error terpicu, dia akan memanggil fungsi penangan error kustom kita. Dengan cara itu, Kamu dapat mengontrol error. Namun umumnya, jenis error tertentu tidak dapat dipulihkan dan memberhentikan pengeksekusian program.

Di sisi lain, exception adalah sesuatu yang dilempar dengan sengaja oleh kode, dan dia diharapkan akan ditangkap di beberapa tempat di dalam aplikasi Kamu. Jadi kita dapat mengatakan bahwa exception dapat dipulihkan berlawanan dengan error tertentu yang tidak dapat dipulihkan. Jika sebuah exception yang dilempar itu ditangkap di suatu tempat dalam aplikasi Kamu, pengeksekusian program berlanjut dari titik di mana exception ditangkap. Dan exception yang tidak tertangkap di manapun dalam aplikasimu menghasilkan sebuah error, sehingga menghentikan pengeksekusian program.

Alur Kontrol Penanganan Exception

Mari kita lihat diagram berikut yang menampilkan alur kontrol penanganan exception secara umum.

Penggunaan fungsi ASERTION pada PHP
Penggunaan fungsi ASERTION pada PHP
Penggunaan fungsi ASERTION pada PHP

Exception dapat dilempar dan ditangkap dengan menggunakan blok try dan catch. Kamu bertanggung jawab melemparkan exception ketika sesuatu yang tidak diharapkan terjadi. Mari kita lihat dasar alur penanganan exception seperti yang ditampilkan di pseudo code berikut.

// code before the try-catch block

try {
  // code

  // if something is not as expected
      // throw exception using the "throw" keyword

  // code, it won't be executed if the above exception is thrown
} catch (Exception $e) {
  // exception is raised and it'll be handled here
  // $e->getMessage() contains the error message
}

// code after the try-catch block, will always be executed

Kebanyakan, ketika Kamu berurusan dengan exception, Kamu akan menggunakan pattern yang ditampilkan di potongan kode di atas. Kamu juga dapat menggunakan blok finally bersamaan dengan blok try dan catch, tetapi kita akan membahasnya nanti di artikel ini.

Blok try adalah yang digunakan ketika Kamu menyangka bahwa kodemu mungkin menghasilkan exception. Kamu harus selalu membungkus kode tersebut dengan menggunakan try dan catch.

Melemparkan Exception

Exception mungkin dilempar oleh fungsi yang Kamu panggil, atau Kamu dapat menggunakan kata kunci throw untuk melempar exception secara manual. Contohnya, Kamu mungkin memvalidasi beberapa input sebelum melakukan operasi apapun, dan melemparkan exception jika data tidak valid.

Perlu diingat bahwa jika Kamu melemparkan sebuah exception tetapi Kamu tidak mendefinisikan block catch yang seharusnya menangani exception tersebut, itu akan menghasilkan fatal error. Jadi Kamu harus pastikan bahwa Kamu selalu mendefinisikan block catch jika Kamu melemparkan exception di Aplikasimu.

Jika sebuah exception ditangkap oleh block catch, objek Exception berisi pesan error yang dilempar dengan menggunakan kata kunci throw. Variabel $e pada contoh di atas adalah instance dari class Exception, jadi dia memiliki akses ke semua method class tersebut. Di dalam blok ini, Kamu harus mendefinisikan logika penanganan exception Kamu sendiri—apa sebenarnya yang mau Kamu lakukan dengan error yang Kamu tangkap.

Pada bagian selanjutnya, kita akan melihat contoh di dunia nyata untuk mengerti bagaimana penanganan exception bekerja.

Contoh di Dunia Nyata

Di bagian ini, kita akan membuat contoh dunia nyata untuk mendemonstrasikan penanganan exception di PHP.

Mari asumsikan bahwa Kamu membuat sebuah aplikasi yang memuat konfigurasi dari file config.php. Sekarang, ini penting bahwa file config.php harus ada ketika aplikasimu dibootstrap. Jadi, aplikasimu tidak dapat berjalan jika file config.php tidak ada. Sehingga ini adalah contoh kasus yang sempurna untuk melempar sebuah exception dan memberitahu pengguna bahwa mereka harus memperbaiki masalah ini.

getMessage();
    die();
}
?>

Seperti yang Kamu lihat pada contoh di atas, kita akan mengecek keberadaan file config.php di awal fase bootstrap. Jika file config.php ditemukan, pengeksekusian dilanjutkan secara normal. Di sisi lain, kita akan melempar sebuah exception jika file config.php tidak ada. Kita juga bisa memberhentikan pengeksekusian jika ada exception.

Jadi itu adalah bagaimana Kamu bisa menggunakan exception di aplikasimu. Kamu harus melempar exception untuk kasus-kasus yang istimewa—Kamu tidak perlu melempar exception untuk error-error umum seperti kedensial pengguna yang tidak valid, permisi dari direktori yang tidak sesuai, dll, yang Kamu tau akan sering terjadi. Hal-hal tersebut lebih baik ditangani oleh pesan error yang umum di normal alur pengeksekusian aplikasi.

Jadi itu adalah contoh dari penanganan exception menggunakan class Exception secara default. Pada bagian selanjutnya, kita akan melihat bagaimana Kamu dapat melakukan penambahan pada class Exception dan membuat kustom exception sendiri aplikasi Kamu.

Bagaimana Membuat Kustom Exception

Di bagian ini, kita akan membahas tentang bagaimana Kamu bisa membuat kustom exception di aplikasimu. Kita akan menambahkan contoh yang kita bahas di bagian sebelumnya untuk mendemonstrasikan kustom exception.

Di contoh sebelumnya, kita melempar konfigurasi exception dengan menggunakan class Exception bawaan. Ini bagus-bagus saja asalkan Kamu hanya mau berurusan dengan pesan exeception error. Tetapi, terkadang Kamu mau melakukan sesuatu yang lebih berdasarkan tipe exception yang dilempar. Inilah saat kustom exception berguna.

Mari kunjungi kembali contoh sebelumnya seperti yang ditampilkan pada potongan kode berikut.

getMessage();
    // other additional actions that you want to carry out for this exception
    die();
} catch (Exception $e) {
    echo $e->getMessage();
    die();
}
?>

Pertama, kita mendefinisikan class ConfigFileNotFoundException yang meng-extend class Exception bawaan. Sekarang, itu menjadi kustom exception class kita dan kita dapat menggunakannya saat kita mau melemparkan ConfigFileNotFoundException exception di aplikasi kita.

Selanjutnya, kita menggunakan kata kunci throw untuk melempar ConfigFileNotFoundException exception jika file config.php tidak ada. Perbedaan penting terletak di block catch. Seperti yang Kamu lihat, kita mendefinisikan dua block catch, dan setiap block digunakan untuk menangkap exception yang berbeda.

Yang pertama menangkap exception bertipe ConfigFileNotFoundException. Jadi, jika exception yang dilempar adalah yang bertipe ConfigFileNotFoundException, blok ini akan dieksekusi. Jika tipe exception tidak sesuai dengan blok catch spesifik manapun, dia akan masuk ke yang terakhir yang ada untuk menangkap semua pesan exception secara umum. 

Blok Finally

Di bagian ini, kita akan membahas bagaimana menggunakan kata kunci finally bersama dengan blok try dan catch. Terkadang, Kamu mau mengeksekusi sepotong kode terlepas dari apakah exception dilempar atau tidak. Inilah di mana Kamu dapat menggunakan block finally, karena kode yang Kamu taruh di block finally akan selalu dieksekusi setelah pengeksekusian blok try dan catch, terlepas dari apakah exception sudah dilempar atau tidak.

Mari kita coba untuk mengerti dengan menggunakan contoh berikut

try {
  // code

  // if something is not as expected
      // throw exception using the "throw" keyword

  // code, it won't be executed if the above exception is thrown
} catch (Exception $e) {
  // exception is raised and it'll be handled here
  // $e->getMessage() contains the error message
} finally {
  // code, it'll always be executed
}

Kode pada contoh di atas kurang lebih sama tetapi dengan tambahan blok finally setelah blok catch. Seperti yang kita bahas sebelumnya, kode di dalam blok ini akan selalu dieksekusi.

Kasus tipikal yang kita dapat pikirkan dari penggunaan blok finally secara umum berhubungan dengan pembersihan sumber daya. Contohnya, jika Kamu membuka koneksi ke database atau file di disk di dalam blok try, Kamu dapat melakukan kegiatan pembersihan seperti menutup koneksi di blok finally karena dia pasti dijalankan.

Penanganan exception adalah keterampilan koding utama dan Kamu harus memikirkan bagaimana exception di tangani ketika membangun aplikasimu. Ini akan membantumu untuk mendeteksi dan menyelamatkan dari error yang tidak terduga di aplikasimu. Saya harap posting ini akan menginspirasi Kamu untuk menulis kode penanganan error yang lebih baik!

Kesimpulan

Hari ini, kita membahas topik tentang penanganan exception di PHP. Di bagian pertama artikel, kita membahas dasar-dasar dari exception di PHP dan membuat contoh dunia nyata untuk mendemonstrasikan bagaimana mereka bekerja. Di bagian akhir, kita mengeksplor bagaimana membuat kustom exception dengan meng-extend class Exception.