errordebugMahir3 mnt baca

Error Handling Dasar

Kelola error dengan elegan: level error, error_reporting, dan halaman error ramah.

Analogi: Sistem Alarm Kebakaran

Error dalam program seperti api kecil: kalau terdeteksi dini dan ditangani, hanya insiden kecil. Kalau diabaikan, membakar seluruh gedung (aplikasi mati total dengan halaman putih). Error handling dasar adalah sistem alarmnya: kenali jenis-jenis error PHP, atur agar terlihat saat development dan tersembunyi saat production.

php
<?php
// Contoh 1: tiga level error yang wajib dikenal
// E_NOTICE/Warning: masalah ringan, program tetap jalan
echo $belumAda;              // Warning: Undefined variable (PHP 8)

// E_WARNING: masalah serius tapi program lanjut
include "file-tidak-ada.php";  // Warning: failed to open stream

// E_ERROR (fatal): program BERHENTI total
tidakAdaFungsiIni();          // Error: Call to undefined function

Hierarkinya: notice/warning = "ada yang salah tapi aku lanjutkan", fatal error = "aku menyerah". Saat belajar, kamu ingin melihat semua: error_reporting(E_ALL) dan display_errors=1 di development.

php
<?php
// Contoh 2: konfigurasi development vs production
// --- DEVELOPMENT (php.ini atau di awal script) ---
error_reporting(E_ALL);
ini_set("display_errors", "1");   // tampilkan error di layar: bagus untuk debug

// --- PRODUCTION ---
// display_errors = 0  (di php.ini): JANGAN tampilkan ke user!
// log_errors = 1
// error_log = "/var/log/php-errors.log"  // catat ke file, bukan ke layar

// Custom error handler: ubah warning jadi catatan rapi
set_error_handler(function ($no, $pesan, $file, $baris) {
    file_put_contents("errors.log",
        date("Y-m-d H:i:s") . " [$no] $pesan di $file:$baris\n", FILE_APPEND);
    return true;   // "sudah kutangani, jangan tampilkan default"
});

Menampilkan error ke user di production membocorkan path file, nama database, dan struktur kodemu ke penyerang. Aturan keras: layar untuk developer, log untuk production.

Jebakan yang Sering Terjadi

Operator @ untuk membungkam error. @file_get_contents(...) menyembunyikan error tapi tidak memperbaikinya: file tetap tidak terbaca dan program lanjut dengan data kosong. Lebih buruk lagi, @ memperlambat eksekusi. Selalu tangani error eksplisit (is_file() dulu, atau try-catch), jangan dibungkam.

die() dengan pesan teknis ke user. die("Query gagal: " . $e->getMessage()) memamerkan detail database ke publik. Ke user: pesan umum. Detail: masukkan ke log.

Membuat Halaman Error Cantik

User tidak boleh melihat error mentah. Buat handler yang menampilkan halaman ramah:

php
<?php
// Production: tangkap semua yang tak tertangani
set_exception_handler(function (Throwable $e) {
    error_log($e->getMessage());   // catat detail untuk developer
    http_response_code(500);
    // tampilkan halaman cantik untuk user
    echo "<h1>Ups, ada gangguan!</h1>";
    echo "<p>Tim kami sudah diberitahu. Coba lagi beberapa saat.</p>";
});

set_error_handler(function ($no, $pesan) {
    throw new ErrorException($pesan, 0, $no);  // ubah warning jadi exception
});

Pola "ubah error jadi exception" (baris terakhir) menyatukan penanganan: semua masalah mengalir ke try-catch atau set_exception_handler. Framework modern melakukan ini secara default.

Catatan teknis: Fungsi trigger_error("Pesan custom", E_USER_WARNING) memungkinkan kodemu sendiri memicu warning dengan pesan pilihanmu, berguna untuk menandai pemakaian fungsi lama (deprecation) di library yang kamu buat.

Tantangan

Error handler sendiri

Buat error-demo.php: pasang set_error_handler yang mencatat ke error.log (FILE_APPEND) dan menampilkan "Ups, ada gangguan." Lalu picu warning dengan include "tidak-ada.php" dan cek isi error.log.