Exception Handling

"Menangkap Error Sebelum Aplikasi Menyerah"

Object-Oriented Programming (OOP) PHP

Pertemuan 11

Tujuan Pembelajaran

  • Mahasiswa memahami konsep Exception sebagai mekanisme pertahanan aplikasi saat terjadi kondisi tidak normal.
  • Mahasiswa mampu menggunakan blok kode try, catch, dan finally.
  • Mahasiswa mengetahui cara melempar error menggunakan keyword throw.
  • Mahasiswa mampu membuat Custom Exception Class untuk mengelompokkan jenis error secara spesifik.

Masalah di Dunia Nyata (Analogi)

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).

🚚 Analogi: Kurir Pengantar Paket
Jika kurir tidak menemukan alamat pelanggan (terjadi Error), apakah dia membakar truknya dan berhenti bekerja secara tiba-tiba (Aplikasi Crash)? Tentu tidak!

Kurir akan:
  1. Mencoba (Try) mencari alamat tersebut.
  2. Melempar laporan (Throw) jika alamat tidak ada.
  3. Kantor pusat Menangkap laporan (Catch) dan memberi pesan maaf ke pelanggan.
Truk tetap aman, operasional tetap berjalan. Inilah Exception Handling!

4 Kata Kunci Utama

Dalam PHP OOP, penanganan Exception berputar pada 4 kata kunci utama:

  • try : Membungkus (blok) kode yang berpotensi menghasilkan error. "Coba jalankan kode ini...".
  • throw : Keyword untuk melempar/memicu objek Exception ketika suatu kondisi tidak wajar terpenuhi.
  • catch : Menangkap objek yang dilempar dari try dan menentukan apa yang harus dilakukan selanjutnya (misal: tampilkan pesan error yang ramah pengguna).
  • finally : (Opsional) Blok kode yang pasti akan dieksekusi baik terjadi error maupun tidak. Biasanya dipakai untuk menutup koneksi database.

Sintaks Dasar: Membagi dengan Nol

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.

Multiple Catch (Menangkap Berbagai Jenis Error)

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.

Custom Exception (Membuat Error Sendiri)

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();
}

Simulasi: Mesin ATM Sederhana

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!

Menunggu proses transaksi...

Source Code Mesin ATM (PHP)

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.";
}

Kesimpulan

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.

Tugas Latihan: Exception Handling

Instruksi: Kerjakan soal di bawah ini sesuai dengan NIM Anda pada kertas lembar kerja yang telah dibagikan.

🟠 Untuk NIM GANJIL

Kasus: "Sistem Peminjaman Buku"

Sistem memiliki aturan: Jika buku yang dipinjam lebih dari 3, aplikasi menolak peminjaman.

  • Buat class custom exception (misal: BatasPeminjamanException).
  • Tuliskan blok try yang berisi fungsi/logika pengecekan (hanya satu blok if).
  • Tuliskan blok catch untuk menangkap error dan finally untuk log penutup.

🔵 Untuk NIM GENAP

Kasus: "Sistem Pemesanan Tiket"

Sistem memiliki aturan: Jika jumlah pesanan lebih besar dari sisa stok (misal stok = 10), pesanan ditolak.

  • Buat class custom exception (misal: StokHabisException).
  • Tuliskan blok try yang berisi fungsi/logika pengecekan pesanan (hanya satu blok if).
  • Tuliskan blok catch untuk menampilkan pesan peringatan dan finally untuk menutup koneksi.