Tutorial OOP Lanjutan
Exception
Materi ini memiliki 1 buah lampiran. Namun Anda tidak dapat mengakses lampiran karena belum terdaftar di kursus ini. Klik disini untuk mendaftar.
Exception adalah object yang dilempar untuk menjelaskan terjadinya error pada script. Nantinya kita bisa meminta keterangan lebih lanjut mengenai errornya melalui object ini. Sebagai contoh, misalkan kita membuat function divide yang berfungsi untuk membagi nilai parameter $x dengan $y. Kemudian function ini kita gunakan untuk membagi angka 5 dengan 0.
Pada sistem komputer, semua angka yang dibagi dengan 0 akan menghasilkan error. Jadi kalau script ini kita jalankan, maka kita mendapatkan pesan fatal error seperti dibawah ini. Uncaught DivisionByZeroError. Disini ada object error yang bernama DivisionByZeroError. Object ini dilempar, namun tidak ada kode yang menangkapnya. Oleh karena itu php langsung menganggapnya sebagai fatal error dan menghentikan eksekusi script.
Bagaimana cara menangkap Exception? Kita bisa menggunakan kata kunci try catch. Pertama kita masukkan dahulu kode yang bisa melempar Exception ke dalam blok kode try. Setelah itu kita gunakan kata kunci catch diikuti oleh tanda kurung dan jenis object error-nya, sebagai contoh disini adalah DivisionByZeroError. Di dalam catch kita bisa menuliskan kode untuk menangani error.
Sebagai contoh kita bisa memanggil method getMessage() untuk mendapatkan pesan error. Namun untuk function yang bersifat lebih rumit, kita membutuhkan keterangan yang lebih banyak mengenai error-nya. Untuk itu kita bisa memanggil method getTrace. Berhubung getTrace mengembalikan data dalam bentuk array, maka untuk menampilkannya kita bisa menggunakan var_dump.
Di dalam catch, kita juga bisa mengatur data apa yang dikembalikan apabila error sudah berhasil ditangani. Apabila kita ingin mengembalikan nilai yang sesuai dengan hasil baginya, semua nilai yang dibagi dengan nilai 0 akan menghasilkan nilai tidak terhingga atau infinite. Pada PHP, nilai infinite dilambangkan dengan konstanta INF, yang merupakan tipe data float. Namun perlu diperhatikan bahwa nilai infinite akan sulit untuk kita proses pada script berikutnya. Jadi sebagai solusi lain, kita bisa mengembalikan nilai null dan menganggap bahwa hasil dari function divide sudah tidak dapat digunakan pada kode berikutnya.
Agar lebih jelas kita langsung coba praktek. Kita buat file divide.php. Di dalamnya kita buat function divide dengan parameter int $x dan int $y, sedangkan hasilnya adalah float. Di dalam function, kita cukup return $x / $y. Kemudian kita coba echo hasil dari function divide.php dengan argument 10, 2. Ditambah PHP_EOL. Kita jalankan php divide.php dan kita mendapatkan hasil 5.
Selanjutnya kita ubah nilai argument kedua menjadi 0. Dan kita mendapatkan fatal error. Disini ada error dengan nama DivisionByZeroError yang tidak ditangkap.
Bagaimana cara menangkap error-nya? Disini kita bisa menggunakan try catch. Pertama kita panggil dulu try ditambah dengan kurung kurawal. Di dalam try ini kita bisa menambahkan kode-kode yang berpotensi error. Sebagai contoh kode untuk membagi $x dengan $y ini.
Selanjutnya kita gunakan kata kunci catch untuk menangkap error-nya. Setelah kata kunci catch kita harus menambahkan tanda kurung dan jenis errornya yaitu DivisionByZeroError. Lalu diikuti lagi dengan nama parameternya, biasanya menggunakan nama $e, singkatan dari Exception atau Error gitu ya. Kita buka kurung kurawal dan di dalamnya bisa kita tambahkan kode-kode yang menangani errornya.
Yang biasa ditulis di dalam catch adalah kode untuk memunculkan pesan error-nya. Ada 2 method yang bisa kita panggil. Untuk pesan error yang sederhana, kita bisa memanggil method getMessage, dan kita mendapatkan satu buah string sederhana berisi pesan error-nya. Kita bisa gunakan echo untuk menampilkannya ke layar. Kita coba ya echo $e->getMessage . PHP_EOL.
Kita coba jalankan. Nah, disini kita masih mendapatkan fatal error ya. Namun pesan kesalahannya berbeda. Kesalahannya adalah function divide seharusnya mengembalikan tipe data float, sedangkan disini tidak ada yang dikembalikan. Untuk sementara kita tambahkan dahulu return 0 untuk mengembalikan nilai 0 agar tidak error. Hasilnya kita mendapatkan kalimat ‘Division by zero’.
Method yang kedua adalah getTrace. Dimana kita mendapatkan pesan error yang lebih lengkap. Namun hasil dari method ini adalah sebuah array. Apabila kita hendak menampilkannya, maka kita bisa menggunakan perintah var_dump. Kita coba ya. Sebagai hasilnya, kita mendapatkan informasi yang lebih lengkap mengenai error-nya, mulai dari nama file, nomor baris, nama function dan argument-nya.
Kode lain yang perlu kita tulis di dalam catch adalah nilai yang dikembalikan oleh function. Tadi kita sudah menambahkan return 0 untuk sementara agar tidak error. Namun untuk contoh yang lebih baik, kita tambahkan dahulu variable $result untuk menampung hasil pembagian. Kemudian pada bagian akhir function, kita kembalikan nilai dari variable $result.
Nah, di dalam catch kita bisa menentukan nilai yang dikembalikan apabila terjadi error. Hasil dari 10 dibagi 0 sebenarnya adalah tidak terhingga atau infinite. Di PHP, kita bisa menuliskan nilai infinite dengan menggunakan konstanta INF. Jadi kita bisa tambahkan kode $result = INF.
Kalau misalkan pesan error kita komentari dahulu. Kemudian kita jalankan. Maka kita mendapatkan nilai INF, yang merupakan nilai infinite atau tidak terhingga dalam bahasa pemograman PHP. Namun perlu diingat bahwa nilai ini akan sulit sekali diolah dalam kode selanjutnya. Jadi sebagai alternatif, kita juga bisa mengembalikan nilai null, untuk menunjukkan bahwa hasil perhitungan dari function divide sudah tidak bisa digunakan pada kode berikutnya.
Kita coba ganti ya, INF menjadi null. Kita jalankan. Kita mendapatkan kode error karena hasil dari function harus dalam bentuk float. Agar nilainya bisa null atau float, maka kita tambahkan tanda tanya di sebelum kata float. Sekarang function sudah bisa mengembalikan nilai float atau nilai null.
Ada satu hal lagi yang perlu kita perhatikan di dalam try catch. Misalkan setelah kode pembagian di dalam try, kita tambahkan satu baris kode lagi yaitu echo “Kode setelah pembagian\n”. Perhatikan kalau kita memanggil divide dengan argument 10,0. Maka “Kode setelah pembagian” ini tidak dijalankan. Jadi pada saat kita membagi $x dengan $y mendapatkan error, maka PHP langsung loncat ke bagian catch. Semua kode berada di dalam try dibawah $x dibagi $y tidak dijalankan sama sekali.
Namun kalau argument kita ganti menjadi 10, 1. Nah disini kita bisa mendapatkan “Kode setelah pembagian”. Setelah itu barulah kita mendapatkan hasilnya yaitu 10.
Kita telah belajar cara menggunakan try catch. Setelah kita menuliskan kode catch, kita memiliki opsi untuk menambahkan kata kunci finally. Semua kode yang berada di dalam finally akan dijalankan, baik pada saat terjadi error maupun pada saat tidak terjadi error. Biasanya kode di dalam finally digunakan untuk menutup penggunaan resource. Misalkan untuk menutup file yang sedang digunakan, atau untuk menutup transaksi atau koneksi database, dan lain-lain.
Kita coba praktek. Misalkan setelah blok catch, kita tambahkan kata kunci finally. Di dalamkan kita tambahkan echo “Kode ini selalu dijalankan\n”. Kita coba jalankan ya. Kita coba untuk argument 5, 0. Artinya terjadi error. Hasilnya kita mendapatkan tulisan “Kode ini selalu dijalankan\n”. Sedangkan nilai hasil function adalah null.
Kita coba ganti argument-nya menjadi 5,1. Sekarang kita mendapatkan tulisan “Kode setelah pembagian” yang berada di dalam blok try. Kemudian ada tulisan “Kode ini selalu dijalankan” yang berada di dalam blok finally. Dan terakhir kita mendapatkan nilai 5 sebagai hasil dari function divide.
Jadi kode di dalam blok finally pasti dijalankan, baik pada saat terjadi error maupun pada saat tidak terjadi error. Biasanya kode di dalam blok finally digunakan untuk menutup penggunaan resource, karena kode untuk penutupan ini harus tetap dijalankan baik pada saat error maupun pada saat tidak error.
Oke, sebelumnya kita sudah belajar mengenai DivisionByZeroError yang secara otomatis dilempar oleh sistem pada saat kita melakukan pembagian dengan penyebut 0. Selanjutnya kita akan belajar mengenai cara melempar error sendiri, dengan menggunakan kata kunci throw. Di bawah ini ada contoh source codenya. Apabila penyebut bernilai nol, maka kita panggil throw untuk melempar error buatan kita sendiri.
Kata throw harus diikuti oleh object yang menjelaskan mengenai error-nya. Jadi disini kita membuat object dari kelas Exception. Pada constructor-nya kita tuliskan keterangan mengenai error, yaitu ‘Penyebut tidak boleh nol’.
Jadi disini kita menggunakan kelas default Exception ya. Bagaimana kalau kita ingin menggunakan kelas sendiri? Bisa ya. Kita bisa membuat kelas turunan dari Exception, untuk menjadi object dari error yang kita lempar sendiri.
Kita coba praktek ya. Kali ini kita buat file baru dengan nama login.php. Pertama kita buat dahulu function validateLogin dengan parameter array $login dan mengembalikan tipe data bool. Biasanya untuk melakukan login, kita perlu mengisi id dan password, dan keduanya tidak boleh kosong ya. Jadi pertama kita lakukan dahulu pemeriksaan. Apabila parameter login dengan index ‘id’ bernilai kosong, maka kita throw new Exception dengan pesan ‘Id tidak boleh kosong’. Selanjutnya kita buat local variable $id untuk menyimpan nilai dari $login[‘id’], agar bisa kita gunakan lagi pada proses berikutnya. Dan pada bagian terakhir kita return true.
Selanjutnya kita buat contoh pemanggilan function validateLogin. Pertama kita buat dahulu array $login dengan ‘id’ bernilai ‘admin’, dan ‘password’ bernilai ‘admin1234’. Ini hanya contoh saja ya. Kalau di proyek nyata, jangan menggunakan password lemah seperti ini. Setelah itu kita panggil function validateLogin menggunakan argument $login.
Kalau kita jalankan, saat ini tidak terjadi error ya. Karena variable $login memiliki ‘id’. Namun kalau kita komentari bagian ‘id’, maka kita terkena error ‘Id’ tidak boleh kosong.
Nah, kalau kita ingin menangkap error tersebut, maka kita mesti menggunakan try catch. Kita pindahkan dahulu kode dari inisialisasi variable $login dan pemanggilan function validateLogin ke dalam try. Kemudian kita tambahkan catch. Berhubung object dibuat dari kelas Exception, maka yang harus kita catch harus Exception juga. Di dalam catch kita echo $e->getMessage() . PHP_EOL. Kalau kita jalankan, maka kita mendapatkan pesan kesalahan Id tidak boleh kosong.
Sejak PHP versi 8, kata kunci throw sudah menjadi expression, sehingga ketiga baris dalam validateLogin ini bisa kita sederhanakan menjadi satu baris, dengan menggunakan null coalescing operator. Bagaimana caranya? Pertama kita assign dahulu nilai variable $id dengan $login[‘id’]. Kemudian kita tambahkan null coalescing operator dengan simbol dua buah tanda tanya. Apabila $login[‘id’] bernilai kosong, maka kita throw new Exception dengan pesan ‘Id tidak boleh kosong’.
Kita komentari dahulu ketiga baris kode diatasnya. Pertama kita coba dahulu kalau ‘id’ kosong, maka kita mendapatkan pesan error bahwa ‘Id tidak boleh kosong’. Sedangkan kalau ‘id’ ada isinya, maka kode berjalan tanpa error.
Berhubung kode ini sudah berjalan benar, maka kita copy paste untuk password. Kita ubah semua kata id menjadi password. Dan kemudian jangan lupa kita tes ya. Kita tes untuk password yang berisi, maka tidak terjadi error. Sedangkan kalau passwordnya kosong maka terjadi error.
Oke, kita sudah belajar cara melempar error dengan menggunakan kelas Exception. Pertanyaan berikutnya, apakah kita bisa melempar error menggunakan kelas sendiri? Jawabannya adalah bisa ya. Kita bisa membuat kelas sendiri yang mengimplementasikan interface Throwable. Namun caranya lumayan ribet ya, karena kita harus menuliskan kode implementasi untuk sekitar 8 method. Untuk cara yang lebih mudah, kita bisa membuat kelas turunan dari Exception.
Sebagai contoh, pada bagian paling atas kode kita tambahkan class EmptyException extends Exception. Jadi sekarang kita sudah memiliki kelas EmptyException. Kita ganti kelas yang dilempar pada error menjadi kelas EmptyException.
Kita jalankan. Perhatikan bahwa pada catch yang ditangkap adalah kelas Exception, sedangkan yang kita lempar adalah EmptyException. Namun error-nya tetap tertangkap ya. Karena EmptyException adalah turunan dari Exception. Kita bisa mengubah catch menjadi EmptyException agar tidak menangkap error dari kelas lainnya. Kalau kita jalankan hasilnya tetap sama ya.
Selanjutnya kita coba buat kelas error lainnya ya. Misalkan nama kelasnya adalah StringLengthException. Akan kita gunakan untuk melempar error apabila jumlah huruf pada id lebih kecil dari 4. Kita tambahkan kode pada function validateLogin. Apabila strlen dari $id nilainya lebih kecil dari 4, maka kita throw new StringLengthException dengan pesan ‘Id tidak boleh kurang dari 4 huruf’.
Kita sengaja coba error-nya ya. Kita ubah nilai ‘id’ menjadi ‘adm’ sehingga kurang dari 4 huruf. Kalau kita jalankan, kita malah mendapatkan pesan error uncaught StringLengthException. Hal ini disebabkan karena pada bagian catch, kita hanya menangkap EmptyException. Jadi berhubung error yang sekarang kelasnya berbeda, maka tidak tertangkap.
Ada beberapa solusi untuk menangkap StringLengthException. Solusi terbaiknya adalah pada bagian catch kita tambahkan tanda pipe dan nama kelas StringLengthException. Jadi sekarang catch dapat menangkap 2 jenis error, yaitu EmptyException dan StringLengthException.
Kita coba ya. Kalau misalkan ‘id’ bernilai ‘adm’ maka kita mendapatkan pesan ‘Id tidak boleh kurang dari 4 huruf’. Sedangkan kalau ‘id’ tidak ada sama sekali, maka kita mendapatkan pesan ‘Id tidak boleh kosong’. Artinya catch dapat menangkap kedua error.
Solusi lainnya adalah dengan mengganti nama kelas yang di-catch menjadi Exception. Berhubung EmptyException dan StringLengthException adalah turunan dari Exception, maka kedua error dapat ditangkap. Kita coba ya. Sudah benar kedua error dapat ditangkap. Namun kelemahan dari cara ini adalah catch dapat sekaligus menangkap jenis error lain yang merupakan turunan dari Exception.
Cara ketiga adalah kita dapat menggunakan 2 buah catch. Catch yang pertama ini kita tulis khusus untuk EmptyException. Setelah itu dibawahnya kita tambahkan lagi catch StringLengthException. Dengan menggunakan cara ini, kita bisa menuliskan kode yang berbeda untuk menangani error-nya. Sebagai contoh pada catch EmptyException kita tambahkan echo “Catch Pertama\n”. Sedangkan pada catch StringLengthException kita tambahkan echo “Catch Kedua\n”.
Kita coba ya. Pertama error ‘id’ kosong dahulu. Kita mendapatkan pesan “Id tidak boleh kosong”, kemudian ada pesan lagi “Catch Pertama”. Artinya kita menjalankan kode pada catch yang pertama.
Kita ganti ‘id’ menjadi ‘adm’. Sekarang kita mendapatkan pesan “Id tidak boleh kurang dari 4 huruf”. Dan kemudian ada pesan lagi “Catch Kedua”. Artinya kita menjalankan kode pada catch yang kedua.
Jadi kita bisa menambahkan catch hingga beberapa kali pada keyword try. Cara seperti ini bisa kita gunakan apabila kita hendak cara yang berbeda-beda untuk menangani error-nya.
Oke ya. Jadi pada video ini kita sudah mempelajari mengenai cara penanganan error menggunakan kata kunci try catch dan finally. Kita juga telah belajar cara membuat error sendiri dengan menggunakan kata kunci throw. Dan kita juga bisa membuat kelas error sendiri, dan telah belajar beberapa teknik untuk mengkombinasikan catch dalam penanganan error. Untuk video ini saya akhiri disini, dan sampai ketemu lagi di video berikutnya.
Dengan menggunakan fasilitas tanya jawab, maka Anda bisa bertanya dan akan dijawab langsung oleh instruktur kursus.
Anda belum terdaftar pada kursus ini sehingga tidak bisa mengajukan pertanyaan.