Sekecil apa pun program yang kita tulis, kegagalan pasti pernah muncul: variabel yang lupa diberi nilai, nama function yang salah ketik, atau berkas yang ternyata tidak ada. PHP melaporkan kegagalan semacam itu melalui pesan error yang tampil di layar, dan pesan tersebut sering terlihat menakutkan bagi pemula. Padahal, pesan error adalah teman terbaik kita: pesan error menyimpan petunjuk persis tentang apa yang salah dan di lokasi mana kejadian berlangsung. Pada chapter ini kita belajar membaca anatomi pesan error, membedakan kegagalan yang masih bisa dilanjutkan dari yang menghentikan program, lalu memetakan dua mekanisme pelaporan kegagalan yang dimiliki PHP.

Apa Itu Error PHP #

Error adalah sinyal kegagalan yang dipicu oleh Zend Engine — mesin yang menjalankan kode PHP — ketika eksekusi menemui kondisi yang tidak bisa diproses. Contoh pemicunya antara lain membaca variabel yang belum pernah dibuat, memanggil function yang tidak terdefinisi, atau menulis sintaks yang tidak dipahami parser. Karena sinyal ini lahir di level engine, error berbeda dari kesalahan logika bisnis; jika kode kita menghitung diskon dengan rumus yang keliru tanpa melanggar aturan bahasa PHP, engine tidak akan mengeluarkan error apa pun.

PHP memiliki dua mekanisme pelaporan kegagalan. Mekanisme pertama adalah error — cara tertua yang berbasis level dan pesan teks, misalnya Warning dan Fatal error, yang menjadi fokus chapter ini. Mekanisme kedua adalah exception — kegagalan berbentuk object yang dilempar dengan keyword throw dan ditangani dengan try-catch; kita bahas tuntas mulai chapter Exceptions . Keduanya saling melengkapi, dan programmer PHP modern perlu menguasai keduanya.

Anatomi Pesan Error #

Setiap pesan error PHP memiliki anatomi yang konsisten dengan empat bagian: label jenis error, pesan deskriptif, nama berkas, dan nomor baris. Mari kita lihat anatomi tersebut pada contoh nyata berikut:

php
<?php
$nama = "Budi";
echo "Halo, $nama\n";
echo "Halo, $pengunjung\n";
echo "Baris ini tetap tereksekusi\n";

Output yang Dihasilkan:

text
Halo, Budi

Warning: Undefined variable $pengunjung in /home/z/my-project/php-course/content/php/error-handling/memahami-php-errors/.verify_tmp.php on line 4
Halo,
Baris ini tetap tereksekusi

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 3 (echo "Halo, $nama\n";): variabel $nama sudah diberi nilai pada baris 2, sehingga echo mencetak Halo, Budi dengan normal.
  2. Baris 4 (echo "Halo, $pengunjung\n";): variabel $pengunjung tidak pernah dibuat, sehingga engine memancarkan Warning: Undefined variable $pengunjung. Pesan tersebut memuat keempat bagian anatomi: jenis (Warning), deskripsi (Undefined variable $pengunjung), berkas tempat kejadian, dan nomor baris.
  3. Baris 5: masih tereksekusi dan mencetak teksnya — bukti bahwa Warning tidak menghentikan program.

PHP juga menyimpan catatan error terakhir di memori. Function error_get_last() mengembalikan array berisi informasi error yang paling baru terjadi, sehingga kita bisa memeriksa error secara terprogram dan tidak sekadar membacanya di layar:

php
<?php
echo "Nilai konstanta E_WARNING: " . E_WARNING . "\n";
echo "Halo, $tamu\n";

$detail = error_get_last();
print_r($detail);

Output yang Dihasilkan:

text
Nilai konstanta E_WARNING: 2

Warning: Undefined variable $tamu in /home/z/my-project/php-course/content/php/error-handling/memahami-php-errors/.verify_tmp.php on line 3
Halo,
Array
(
    [type] => 2
    [message] => Undefined variable $tamu
    [file] => /home/z/my-project/php-course/content/php/error-handling/memahami-php-errors/.verify_tmp.php
    [line] => 3
)

Mari kita bedah contoh kedua di atas:

  1. Baris 2: konstanta E_WARNING bernilai 2 — setiap level error memiliki konstanta representatifnya sendiri, materi chapter berikutnya.
  2. Baris 3: variabel $tamu tidak terdefinisi sehingga muncul Warning yang mencatat baris 3 sebagai lokasi kejadian.
  3. Baris 5-6: error_get_last() mengembalikan array dengan empat kunci yang persis memetakan anatomi pesan: type (angka level, 2 untuk E_WARNING), message, file, dan line.

Warning Melanjutkan Eksekusi, Fatal Error Menghentikan #

Dampak error terhadap program terbagi dua macam. Warning bersifat non-fatal: program diberi tahu bahwa ada masalah, lalu eksekusi dilanjutkan dengan nilai pengganti — variabel tak terdefinisi dibaca sebagai null. Fatal error bekerja sebaliknya: engine menghentikan eksekusi tepat di titik kejadian, baris-baris setelahnya tidak pernah dijalankan, dan proses PHP keluar dengan exit code 255. Perhatikan contoh fatal berikut:

php
<?php
echo "Sebelum pemanggilan fungsi\n";
$total = hitungTotalBelanja(150000);
echo "Baris ini tidak pernah tereksekusi\n";

Output yang Dihasilkan:

text
Sebelum pemanggilan fungsi

Fatal error: Uncaught Error: Call to undefined function hitungTotalBelanja() in /home/z/my-project/php-course/content/php/error-handling/memahami-php-errors/.verify_tmp.php:3
Stack trace:
#0 {main}
  thrown in /home/z/my-project/php-course/content/php/error-handling/memahami-php-errors/.verify_tmp.php on line 3

Mari kita telaah kejadian pada contoh di atas:

  1. Baris 2: teks Sebelum pemanggilan fungsi tercetak normal.
  2. Baris 3: nama hitungTotalBelanja() tidak dikenal engine, sehingga muncul Fatal error: Uncaught Error: Call to undefined function hitungTotalBelanja() lengkap dengan berkas dan baris kejadian.
  3. Baris 4: tidak pernah tereksekusi karena eksekusi sudah berhenti; proses PHP keluar dengan exit code 255, bukan 0.

Perbandingan ringkas kedua karakteristik tersebut dapat dilihat pada tabel berikut:

KarakteristikWarningFatal error
Eksekusi setelah kejadianberlanjutberhenti total
Exit code proses0255
Contoh pemicuvariabel atau array key tidak terdefinisifunction atau konstanta tidak ada, membagi dengan nol
Penanganan utamaperbaiki kode hingga Warning hilangperbaiki kode; dapat pula ditangkap catch (Error)

Kata Uncaught Error pada pesan fatal di atas bukan kebetulan: sejak PHP 7, mayoritas fatal error berwujud object bertipe Error yang — sama seperti exception — dapat ditangkap oleh blok catch. Mekanisme penangkapan ini kita latih tuntas pada chapter try-catch-finally .

Error dan Exception sebagai Dua Mekanisme Pelaporan #

Sebelum melangkah lebih jauh, mari kita petakan perbedaan kedua mekanisme kegagalan PHP agar arah pembelajaran kita jelas:

AspekErrorException
Sumber kegagalanengine PHP, dipicu otomatiskode aplikasi, dilempar eksplisit dengan throw
Representasipesan teks dengan level tertentuobject dari class turunan Exception
Cara mengaturerror_reporting() dan konfigurasi php.iniditangkap try-catch, atau dibiarkan menjadi fatal
Contoh kejadianUndefined variable, Call to undefined functionSaldo tidak cukup, Email tidak valid

Kedua mekanisme tersebut tidak saling menggantikan. Error menjaga kesehatan bahasa — kecocokan sintaks, keberadaan variabel, dan ketersediaan function — sedangkan exception mengekspresikan aturan bisnis yang dilanggar, misalnya saldo yang kurang atau input yang tidak valid. Section ini membahas keduanya secara berurutan, dimulai dari sisi error.

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 dengan php contoh.php.

Ringkasan #

Error adalah sinyal kegagalan level engine dengan anatomi pesan yang tetap: jenis, pesan deskriptif, berkas, dan baris. Warning memperingatkan tanpa menghentikan eksekusi, sementara fatal error menghentikan program total dengan exit code 255. Di samping error, PHP menyediakan exception sebagai mekanisme kegagalan berbasis object untuk aturan bisnis. Setiap error membawa label level seperti E_WARNING dan E_ERROR; peta level inilah yang kita pelajari 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 "Memahami PHP Errors".
// Jalankan dengan: php contoh.php

$nama = "Budi";
echo "Halo, $nama\n";
echo "Halo, $pengunjung\n";
echo "Baris ini tetap tereksekusi\n";

echo "\n";
echo "Nilai konstanta E_WARNING: " . E_WARNING . "\n";
echo "Halo, $tamu\n";

$detail = error_get_last();
print_r($detail);