Error Handling (Penanganan Error)

Saat membuat aplikasi web, hal buruk pasti akan terjadi: koneksi ke database mati, file tidak ditemukan, atau user sengaja menginput data aneh.

Aplikasi yang baik tidak akan menampilkan kode error PHP mentah ke user (karena terlihat tidak profesional dan membahayakan keamanan), melainkan menanganinya dengan anggun.

1. Try ... Catch (Menangkap Error)

Blok try...catch digunakan untuk "mengurung" kode yang berpotensi error. Jika error terjadi, program tidak langsung mati (Crash), melainkan "dilempar" ke blok catch untuk ditangani secara diam-diam.

<?php
try {
    // 1. Coba lakukan sesuatu yang berisiko
    $pdo = new PDO("mysql:host=localhost;dbname=toko", "root", "password_salah");
    
    echo "Koneksi sukses!"; // Baris ini DILEWATI jika terjadi error di atasnya
    
} catch (PDOException $e) {
    // 2. Tangkap errornya jika terjadi
    
    // Log pesan error teknis ke file (untuk dibaca oleh developer saja)
    error_log("Database error: " . $e->getMessage());
    
    // Tampilkan pesan yang ramah ke User biasa
    echo "<h1>Maaf, sistem sedang mengalami gangguan.</h1>";
    echo "<p>Tim teknisi kami sedang memperbaikinya. Silakan kembali beberapa saat lagi.</p>";
    
    // Hentikan eksekusi script selanjutnya
    exit;
}

2. Melempar Error Sendiri (Throw Exception)

Selain menangani error dari sistem (seperti PDO), kamu juga bisa "menciptakan" kondisi error secara sengaja ketika alur bisnis (business logic) aplikasi dilanggar.

Contoh kasus: Sistem transfer uang.

<?php
function transfer_saldo($saldo_pengirim, $jumlah_transfer) {
    
    if ($jumlah_transfer <= 0) {
        // Lempar pesan error jika transfer minus atau nol
        throw new Exception("Jumlah transfer tidak valid!");
    }
    
    if ($saldo_pengirim < $jumlah_transfer) {
        // Lempar pesan error jika uang tidak cukup
        throw new Exception("Saldo Anda tidak mencukupi!");
    }
    
    // Jika aman, potong saldo
    return $saldo_pengirim - $jumlah_transfer;
}

// --- Cara Menggunakannya ---
try {
    $sisa_saldo = transfer_saldo(50000, 100000);
    echo "Transfer berhasil! Sisa saldo: Rp " . $sisa_saldo;
    
} catch (Exception $e) {
    // Menangkap dan menampilkan error yang "dilempar" di atas
    echo "<div style='color: red; padding: 10px; border: 1px solid red;'>
            GAGAL: " . $e->getMessage() . "
          </div>";
}

3. Environment: Development vs Production

Perlakuan terhadap error PHP harus dibedakan tergantung di mana aplikasimu sedang berjalan.

Saat Development (Di Komputer Kamu)

Kamu INGIN melihat semua pesan error sedetail mungkin (nama file, nomor baris, penyebab error) agar mudah mencari bug (Debugging).

error_reporting(E_ALL);
ini_set('display_errors', 1); // 1 = TAMPILKAN di layar browser

Saat Production (Live di Internet)

Kamu TIDAK BOLEH menampilkan pesan error PHP/Database ke user! Hacker bisa memanfaatkan informasi error (seperti path folder, username database, versi SQL) untuk meretas websitemu.

error_reporting(E_ALL);
ini_set('display_errors', 0); // 0 = SEMBUNYIKAN dari layar browser
ini_set('log_errors', 1);     // 1 = CATAT error secara rahasia ke dalam file (error.log)

Cara menerapkannya di aplikasi secara dinamis:

<?php
// file: config/app.php
define('ENVIRONMENT', 'development'); // Ubah jadi 'production' jika web sudah live!

if (ENVIRONMENT === 'development') {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
} else {
    error_reporting(E_ALL);
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    // Tentukan lokasi file log rahasia
    ini_set('error_log', __DIR__ . '/../logs/php-error.log'); 
}

4. Halaman Error 404 (Not Found) Kustom

Jika data tidak ditemukan dari database (misal: user iseng mengubah URL edit.php?id=99999), jangan biarkan halamannya blank atau error. Tampilkan halaman 404 yang cantik.

<?php
// file: detail-produk.php
require 'config/database.php';

$id = $_GET['id'] ?? 0;

$stmt = $pdo->prepare("SELECT * FROM produk WHERE id = ?");
$stmt->execute([$id]);
$produk = $stmt->fetch();

// JIKA PRODUK TIDAK ADA DI DATABASE
if (!$produk) {
    // 1. Beritahu browser dan mesin pencari (Google) bahwa halaman ini 404
    http_response_code(404);
    
    // 2. Tampilkan file HTML/PHP khusus yang berisi desain 404 cantik
    include 'templates/404.php';
    
    // 3. Wajib hentikan eksekusi script di bawahnya!
    exit;
}
?>

<!-- Eksekusi ini hanya berjalan jika produk DITEMUKAN -->
<h1>Menampilkan detail produk: <?= htmlspecialchars($produk['nama_produk']) ?></h1>

Dengan mengimplementasikan Error Handling yang baik, websitemu akan menjadi lebih tangguh (robust) dan aman dari serangan peretas.