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
// 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 functionHierarkinya: 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
// 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
// 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.