Pada chapter sebelumnya kita sudah membaca anatomi pesan error dan mengenal label Warning serta Fatal error. PHP sesungguhnya tidak memperlakukan semua error secara sama: setiap error membawa satu level yang menentukan seberapa serius kegagalan tersebut dan apakah engine perlu menghentikan eksekusi. Pada chapter ini kita memetakan daftar level error, mengatur level mana yang dilaporkan dengan function error_reporting(), memahami operator penekan @, lalu memicu error buatan sendiri dengan konstanta E_USER_*.

Daftar Level Error di PHP #

Level error ditulis sebagai konstanta yang diawali E_. Engine mengelola level aktif dalam bentuk bitmask — satu angka yang setiap bit-nya mewakili satu level — sehingga level dapat digabungkan dan diuji dengan operator bitwise. Tabel berikut merangkum level yang paling sering kita temui:

KonstantaArtiDampak eksekusiContoh pemicu
E_ERRORkesalahan fatal saat runtimeberhenti total, exit 255memanggil function yang tidak ada
E_WARNINGperingatan saat runtimeberlanjutvariabel atau array key tidak terdefinisi, gagal membuka berkas
E_PARSEkesalahan sintaks saat parsingskrip tidak jalan sama sekalititik koma atau kurung kurawal hilang
E_NOTICEpemberitahuan ringan (warisan)berlanjutkini jarang muncul di PHP 8
E_DEPRECATEDfitur usang yang akan dihapusberlanjutparameter implicitly-nullable pada PHP 8.4
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATEDerror yang dipicu kode sendirimengikuti padanan level engine-nyavalidasi versi atau konfigurasi yang tidak dikenal

Ada pula level internal seperti E_CORE_ERROR dan E_COMPILE_ERROR yang dipicu engine saat proses startup dan kompilasi; level tersebut jarang kita tangani langsung dalam kode sehari-hari. Perlu dicatat pula riwayat E_NOTICE: sejak PHP 8.0, mayoritas pemicu E_NOTICE — termasuk variabel dan kunci array yang tidak terdefinisi — dinaikkan menjadi E_WARNING, dan E_STRICT digabungkan ke level lain. Konstanta E_NOTICE tetap ada demi kompatibilitas kode lama.

Membaca dan Mengatur Level dengan error_reporting() #

Function error_reporting() memiliki dua peran sekaligus: dipanggil tanpa argumen untuk membaca level yang sedang aktif, atau dipanggil dengan argumen untuk mengubahnya sejak saat itu. Contoh berikut menampilkan cara membaca hasilnya dan menguji keanggotaan sebuah level:

php
<?php
error_reporting(E_ALL);
$level = error_reporting();

echo "Nilai error_reporting(): $level\n";
echo "E_WARNING dilaporkan    : " . (($level & E_WARNING) ? "ya" : "tidak") . "\n";
echo "E_DEPRECATED dilaporkan : " . (($level & E_DEPRECATED) ? "ya" : "tidak") . "\n";

Output yang Dihasilkan:

text
Nilai error_reporting(): 30719
E_WARNING dilaporkan    : ya
E_DEPRECATED dilaporkan : ya

Mari kita bedah contoh di atas baris per baris:

  1. Baris 2 (error_reporting(E_ALL);): konstanta E_ALL mengaktifkan seluruh level, lalu baris 3 membaca nilai aktifnya kembali.
  2. Baris 5: angka 30719 pada PHP 8.4 adalah hasil operasi bit dari seluruh level yang aktif; nilai angka ini berbeda antar versi PHP, jadi jangan dihafal — yang penting adalah cara membacanya.
  3. Baris 6-7: ekspresi $level & E_WARNING menguji apakah bit E_WARNING menyala di dalam $level; hasil selain nol berarti level tersebut dilaporkan, lalu ternary menerjemahkannya menjadi ya atau tidak.

Pengaturan yang sama dapat dibuat permanen melalui berkas konfigurasi php.ini sehingga berlaku untuk semua skrip:

ini
; php.ini — konfigurasi pelaporan error
error_reporting = E_ALL
display_errors = On

Menyembunyikan Level dari Pelaporan #

Argumen error_reporting() menerima ekspresi bitwise, sehingga kita bisa menyusun kombinasi bebas. Pola E_ALL & ~E_WARNING berarti “semua level kecuali E_WARNING” — operator ~ membalik bit sehingga bit E_WARNING mati:

php
<?php
error_reporting(E_ALL & ~E_WARNING);

echo "Mulai program\n";
echo "Halo, $tamu\n";
echo "Program selesai tanpa Warning\n";

Output yang Dihasilkan:

text
Mulai program
Halo,
Program selesai tanpa Warning

Pada contoh di atas, baris 2 mematikan pelaporan E_WARNING, sehingga masalah variabel $tamu pada baris 5 tidak lagi ditampilkan dan program berjalan seakan tanpa cacat. Proses tetap keluar dengan exit code 0 karena Warning memang tidak fatal.

Operator Penekan @ #

PHP menyediakan operator @ yang diletakkan sebelum sebuah ekspresi untuk menekan pesan error yang mungkin dipancarkan oleh ekspresi itu saja. Perhatikan contoh berikut pada operasi membaca berkas:

php
<?php
error_reporting(E_ALL);

$isi = @file_get_contents("berkas-tidak-ada.txt");
echo $isi === false ? "Berkas tidak dapat dibaca\n" : "Berkas terbaca\n";

$detail = error_get_last();
echo "Terekam di error_get_last(): " . $detail["message"] . "\n";

Output yang Dihasilkan:

text
Berkas tidak dapat dibaca
Terekam di error_get_last(): file_get_contents(berkas-tidak-ada.txt): Failed to open stream: No such file or directory

Mari kita telaah perilaku operator @ pada contoh di atas:

  1. Baris 4: tanpa @, file_get_contents() memancarkan Warning karena berkas tidak ada; dengan @, pesan tersebut ditekan sehingga layar bersih.
  2. Baris 5: function tetap mengembalikan false — penekanan hanya menyembunyikan laporan, bukan mengubah perilaku, sehingga pemeriksaan $isi === false tetap berjalan.
  3. Baris 7-8: error_get_last() membuktikan error-nya tetap terekam di memori meski tidak ditampilkan.

Karena sifat itulah operator @ sebaiknya dihindari: @ menyembunyikan gejala, mempersulit debugging, dan menambah sedikit beban performa. Penanganan yang lebih sehat adalah pemeriksaan eksplisit, misalnya memanggil file_exists() sebelum membaca berkas, lalu mengambil keputusan berdasarkan hasil pemeriksaan tersebut.

Memicu Error Sendiri dengan E_USER_* #

Kode kita sendiri juga bisa melaporkan masalah melalui function trigger_error() yang menerima pesan dan level E_USER_*. Contoh berikut memperingatkan penggunaan versi PHP yang tidak didukung:

php
<?php
error_reporting(E_ALL);

function cekVersi(string $versi) {
    if ($versi !== "8.4") {
        trigger_error("Versi $versi tidak didukung, gunakan 8.4", E_USER_WARNING);
    }
    echo "Eksekusi fungsi tetap berlanjut\n";
}

cekVersi("7.4");

Output yang Dihasilkan:

text

Warning: Versi 7.4 tidak didukung, gunakan 8.4 in /home/z/my-project/php-course/content/php/error-handling/error-levels/.verify_tmp.php on line 6
Eksekusi fungsi tetap berlanjut

Pada contoh di atas, trigger_error() pada baris 6 memancarkan pesan berlabel Warning — persis seperti warning bawaan engine, lengkap dengan berkas dan baris kejadian — namun eksekusi fungsi tetap berlanjut ke baris 8 karena E_USER_WARNING tidak fatal. Level E_USER_ERROR bekerja berbeda: level tersebut menghentikan eksekusi program sama seperti fatal error bawaan:

php
<?php
error_reporting(E_ALL);

function muatKonfigurasi(string $lingkungan) {
    if ($lingkungan !== "produksi") {
        trigger_error("Lingkungan $lingkungan tidak dikenal", E_USER_ERROR);
    }
    echo "Konfigurasi berhasil dimuat\n";
}

echo "Memuat konfigurasi...\n";
muatKonfigurasi("pengembangan");
echo "Baris ini tidak pernah tereksekusi\n";

Output yang Dihasilkan:

text
Memuat konfigurasi...

Deprecated: Passing E_USER_ERROR to trigger_error() is deprecated since 8.4, throw an exception or call exit with a string message instead in /home/z/my-project/php-course/content/php/error-handling/error-levels/.verify_tmp.php on line 6

Fatal error: Lingkungan pengembangan tidak dikenal in /home/z/my-project/php-course/content/php/error-handling/error-levels/.verify_tmp.php on line 6

Perhatikan dua pesan yang muncul pada output di atas. Pesan Deprecated pertama menandakan bahwa sejak PHP 8.4, pengiriman E_USER_ERROR ke trigger_error() sendiri sudah dianggap usang; rekomendasi resminya adalah memakai exception atau exit dengan pesan. Meski demikian, fatal error tetap dieksekusi: eksekusi berhenti di baris 6, baris 13 tidak pernah tereksekusi, dan proses keluar dengan exit code 255.

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh non-fatal di atas dalam satu program utuh yang dapat Anda unduh dan jalankan langsung.

Ringkasan #

Setiap error PHP membawa level: E_ERROR menghentikan program, E_WARNING dan E_DEPRECATED hanya memperingatkan, sedangkan E_PARSE membuat skrip gagal sebelum eksekusi. Function error_reporting() membaca dan mengatur kombinasi level aktif melalui operasi bitwise, operator @ menekan laporan dari satu ekspresi, dan trigger_error() memicu level E_USER_* dari kode kita sendiri. Setelah peta level ini, kita bedah tiga kategori kegagalan yang paling sering dijumpai sehari-hari pada chapter berikutnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php

// contoh.php — rangkuman contoh chapter "Error Levels".
// Jalankan dengan: php contoh.php

error_reporting(E_ALL);
$level = error_reporting();

echo "Nilai error_reporting(): $level\n";
echo "E_WARNING dilaporkan    : " . (($level & E_WARNING) ? "ya" : "tidak") . "\n";
echo "E_DEPRECATED dilaporkan : " . (($level & E_DEPRECATED) ? "ya" : "tidak") . "\n";

echo "---\n";

error_reporting(E_ALL & ~E_WARNING);
echo "Mulai program\n";
echo "Halo, $tamu\n";
echo "Program selesai tanpa Warning\n";

echo "---\n";

error_reporting(E_ALL);
$isi = @file_get_contents("berkas-tidak-ada.txt");
echo $isi === false ? "Berkas tidak dapat dibaca\n" : "Berkas terbaca\n";

$detail = error_get_last();
echo "Terekam di error_get_last(): " . $detail["message"] . "\n";

echo "---\n";

function cekVersi(string $versi) {
    if ($versi !== "8.4") {
        trigger_error("Versi $versi tidak didukung, gunakan 8.4", E_USER_WARNING);
    }
    echo "Eksekusi fungsi tetap berlanjut\n";
}

cekVersi("7.4");