"Menangkap Error Sebelum Aplikasi Menyerah"
Object-Oriented Programming (OOP) PHP
Pertemuan 11
try, catch, dan finally.throw.Bayangkan Anda membuat sistem yang rumit, lalu ada satu kesalahan kecil (misalnya, koneksi database terputus atau file tidak ditemukan). Tanpa penanganan yang baik, aplikasi PHP Anda akan memunculkan Fatal Error dan halaman web menjadi putih (Blank Screen of Death).
Dalam PHP OOP, penanganan Exception berputar pada 4 kata kunci utama:
Exception ketika suatu kondisi tidak wajar terpenuhi.try dan menentukan apa yang harus dilakukan selanjutnya (misal: tampilkan pesan error yang ramah pengguna).Secara logis, pembagian dengan angka nol (0) tidak terdefinisi dan akan membuat program error. Kita akan menangkapnya!
<?php function bagiAngka($a, $b) { if ($b == 0) { // Memicu (lempar) error jika pembaginya 0 throw new Exception("Tidak bisa membagi dengan nol!"); } return $a / $b; } try { echo bagiAngka(10, 0); echo "Baris ini tidak akan pernah dieksekusi."; } catch (Exception $e) { // Menangkap error dan menampilkan pesannya echo "Terjadi Kesalahan: " . $e->getMessage(); } finally { echo " Blok eksekusi selesai."; } // Output: Terjadi Kesalahan: Tidak bisa membagi dengan nol! Blok eksekusi selesai.
Kadang, dalam satu proses bisa terjadi bermacam-macam error. PHP menyediakan berbagai tipe Exception bawaan, dan kita bisa menangkapnya satu persatu layaknya jaring ikan dengan lubang berbeda.
try { // ... kode untuk mengupload gambar ... } catch (TypeError $e) { echo "Tipe data tidak sesuai: gambar harus berupa string URL."; } catch (InvalidArgumentException $e) { echo "Format gambar tidak didukung (harus JPG/PNG)."; } catch (Exception $e) { // Tangkapan jaring terakhir (jika error tidak diketahui) echo "Terjadi error sistem: " . $e->getMessage(); }
*Aturan penting: Letakkan Exception spesifik di atas, dan Exception global (jaring terakhir) di paling bawah blok catch.
Untuk aplikasi yang lebih profesional, kita tidak hanya mengandalkan Exception bawaan PHP. Kita bisa membuat class Error kita sendiri dengan melakukan extends Exception.
// 1. Membuat class error khusus class SaldoTidakCukupException extends Exception { public function peringatanWarnaMerah() { return "<span style='color:red'>[CRITICAL] " . $this->getMessage() . "</span>"; } } // 2. Menggunakannya try { $saldo = 50000; $tarik = 100000; if ($tarik > $saldo) { throw new SaldoTidakCukupException("Saldo Anda Kurang!"); } } catch (SaldoTidakCukupException $e) { echo $e->peringatanWarnaMerah(); }
Uji coba alur try-catch-finally di bawah ini. Saldo di ATM adalah Rp 100.000. Cobalah tarik tunai dengan jumlah yang lebih kecil, lalu cobalah dengan jumlah yang lebih besar!
class SaldoKurangException extends Exception {} function tarikTunai($tarik) { $saldoAwal = 100000; if ($tarik > $saldoAwal) { throw new SaldoKurangException("Maaf, Saldo Anda Kurang!"); } return $saldoAwal - $tarik; } try { // Mengambil input dari user $sisa = tarikTunai($inputTarik); echo "Transaksi Berhasil. Sisa saldo: Rp " . $sisa; } catch (SaldoKurangException $e) { echo "Error Ditangkap: " . $e->getMessage(); } finally { echo "Mencetak struk / Menutup koneksi database."; }
Tanpa Exception Handling, satu kesalahan kecil bisa membuat seluruh aplikasi mati lemas.
Dengan menggunakan blok try-catch, kita mengubah "Fatal Error" yang mematikan menjadi "Peringatan Terkontrol" yang elegan. Aplikasi menjadi jauh lebih kuat (robust) dan pengguna akan mendapatkan informasi error yang jauh lebih ramah.
Instruksi: Kerjakan soal di bawah ini sesuai dengan NIM Anda pada kertas lembar kerja yang telah dibagikan.
Kasus: "Sistem Peminjaman Buku"
Sistem memiliki aturan: Jika buku yang dipinjam lebih dari 3, aplikasi menolak peminjaman.
BatasPeminjamanException).try yang berisi fungsi/logika pengecekan (hanya satu blok if).catch untuk menangkap error dan finally untuk log penutup.Kasus: "Sistem Pemesanan Tiket"
Sistem memiliki aturan: Jika jumlah pesanan lebih besar dari sisa stok (misal stok = 10), pesanan ditolak.
StokHabisException).try yang berisi fungsi/logika pengecekan pesanan (hanya satu blok if).catch untuk menampilkan pesan peringatan dan finally untuk menutup koneksi.