Cara menggunakan php log levels

Kemunculan error saat pengembangan suatu aplikasi adalah sesuatu yang tidak-bisa-tidak. Ia pasti terjadi. Bahkan ketika aplikasi/web yang kita kerjakan sudah rilis pun, error tetap menjadi makanan sehari-hari kita. Ia pasti dan harus muncul.

Error apa pun yang muncul, harus ditangani dengan tepat. Baik ketika aplikasi masih dalam pengembangan, lebih-leibh lagi ketika aplikasi telah dilempar ke publik.

Penangan standar terhadap suatu error adalah:

  1. Menampilkan pesan permohonan maaf kepada pengguna karena terjadi error
  2. Menyimpan atau menulis log error agar bisa kita perbaiki dengan mudah
  3. Mengirim pemberitahuan secara real-time ke pemrogram agar error bisa ditangani saat itu juga

Jenis-Jenis Error Pada PHP

Di dalam PHP, terdapat beberapa jenis dan tingkatan level error. Sebagiannya error yang sangat fatal sehingga program tidak bisa dilanjutkan, sebagiannya lagi hanya bersifat peringatan sehinggax` program masih bisa dilanjutkan.

Berikut ini beberapa diantara level dan jenis error yang harus diketahui pada PHP:

KonstantaDeskripsiLevelE_ERRORError fatal yang terjadi saat run-time program. Eksekusi skrip akan langsung dihentikan1E_WARNINGError non-fatal yang terjadi saat run-time. Skrip (setelah terjadi error) tetap dieksekusi2E_PARSEError yang terjadi pada saat compile-time. Error parse ini terjadi ketika interpreter PHP mendeteksi adanya sintaks error.4E_NOTICEPemberitahuan kemungkinan error pada saat run-time. Suatu baris program bisa jadi ia normal-normal saja, tapi bisa jadi error pada keadaan tertentu.8E_USER_ERRORError fatal yang terjadi saat run-time program. Sama dengan E_ERROR hanya saja error jenis ini dipicu oleh pemrogram dengan memanggil fungsi
<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}
3256E_USER_WARNINGError non-fatal yang terjadi saat run-time. Sama dengan E_WARNING hanya saja error jenis ini dipicu oleh pemrogram dengan memanggil fungsi
<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}
3512E_USER_NOTICEPemberitahuan kemungkinan error pada saat run-time. Sama dengan E_NOTICE hanya saja error jenis ini dipicu oleh pemrogram dengan memanggil fungsi
<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}
31024

Untuk level error yang lebih lengkap, silakan merujuk ke dokumentasi manual PHP.

Cara Penanganan Error

Setiap kali menulis kode program, kita harus selalu membuat pemeriksaan pada setiap kemungkinan terjadinya error. Sehingga jika memang terjadi error pada tempat tersebut, kita bisa memberikan aksi yang tepat.

Di antara cara penanganan error yang bisa kita lakukan adalah:

  1. Menggunakan fungsi
    <?php
    
    # sembunyikan semua pesan error bawaan PHP
    error_reporting(0);
    
    /**
     * Fungsi untuk menangai error.
     * 
     * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
     */
    function tanganiError ($level, $message, $file, $line) {
      echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
      echo    "<b>Terjadi Error</b>";
      echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
      echo "</div>";
    }
    
    6
  2. Memusatkan penanganan error pada satu fungsi khusus
  3. Menggunakan exception

Menggunakan Fungsi <?php # sembunyikan semua pesan error bawaan PHP error_reporting(0); /** * Fungsi untuk menangai error. * * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas. */ function tanganiError ($level, $message, $file, $line) { echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>"; echo "<b>Terjadi Error</b>"; echo "<p>[{$level}] {$message} - {$file}:{$line}</p>"; echo "</div>"; } 6

Misalkan kita akan membuka dan membaca suatu file dengan PHP, kita harus memeriksa terlebih dahulu apakah file tersebut tersedia atau tidak. Jika ternyata file tidak tersedia, kita bisa menghentikan run-time program dengan memanggil fungsi

<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}
6.

Perhatikan kode program berikut:

<?php

$namaFile = "/web/documents/histori.txt";

if (!file_exists($namaFile)) {
  die("File tidak ditemukan");
} else {
  $file = fopen($namaFile, "r");
  echo "File berhasil dibaca.";
}

// lanjutkan kode jika file berhasil dibaca

Pemusatan Error Handling

Selain cara menggunakan

<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}
9 seperti di atas, kita bisa melakukan cara yang lebih umum yaitu dengan memusatkan error handling dalam satu fungsi saja.

Sehingga setiap kali ada error dari setiap level, fungsi tersebut akan otomatis dipanggil. Setelah itu, kita bisa memutuskan apa yang akan kita lakukan dengan error yang terjadi tersebut.

Langkah-langkahnya adalah:

1. Membuat fungsi

Langkah yang pertama adalah membuat fungsi khusus untuk menangani error.

Fungsi tersebut harus memiliki 5 buah parameter:

  • $errLevel: berisi konstanta tipa error level
  • $errMessage: berisi label/pesan dari error
  • $errFile: berisi file di mana error terjadi
  • $errLine: berisi baris di mana error terjadi

Sebelum itu, jangan lupa kita non aktifkan semua pesan error. Karena beberapa pengaturan bawaan PHP di sistem operasi tertentu pesan error akan ditampilkan secara default. Sehingga kita harus mengaturnya mandiri dengan mengubah nilai di file

<?php

set_error_handler('tanganiError');
0 mau pun dengan memanggil fungsi
<?php

set_error_handler('tanganiError');
1.

<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}

2. Mengatur fungsi tersebut sebagai error handler

Kita telah membuat fungsi

<?php

set_error_handler('tanganiError');
2. Fungsi tersebut menerima 5 buah parameter.

Yang harus kita lakukan selanjutnya adalah mengatur fungsi tersebut sebagai error handler. Sehingga jika terjadi error apa pun pada saat run-time, fungsi tersebut akan dieksekusi.

Untuk mengatur error handler kita bisa memanggil fungsi bawaan PHP bernama

<?php

set_error_handler('tanganiError');
3.

<?php

set_error_handler('tanganiError');

3. Testing error

Kita coba memicu sebuah error dengan memanggil variabel yang tidak pernah kita definisikan sebelumnya.

<?php

# variabel $tes tidak ada
echo $tes;

Setelah program dijalankan, berikut ini output yang saya dapatkan:

Menggunakan Shutdown Function

Cara di atas memang sekilas berhasil, akan tetapi cara tersebut tidak berfungsi untuk semua jenis error.

Kita telah berusaha memanggil suatu variabel yang belum pernah kita definisikan sebelumnya.

Akan tetapi jika kita memanggil sebuah fungsi yang tidak pernah didefinisikan, level error yang dihasilkan adalah:

<?php

set_error_handler('tanganiError');
4. Dan level ini tidak didukung oleh
<?php

set_error_handler('tanganiError');
3. Sehingga fungsi
<?php

set_error_handler('tanganiError');
2 tidak pernah dipanggil.

Coba kode program berikut:

<?php

# fungsi selamatPagi() tidak pernah kita definisikan
selamatPagi();

Dan setelah dieksekusi, fungsi

<?php

set_error_handler('tanganiError');
2 yang telah kita set sebagai error handler ternyata memang tidak dianggil. Ini tangkapan layar dari apa yang saya dapat:

Lalu bagaimana caranya?

Agar kita bisa menangani error level

<?php

set_error_handler('tanganiError');
4, kita punya pilihan untuk menggunakan shutdown function.

Shutdown function adalah fungsi yang akan dipanggil sesaat ketika program PHP akan selesai. Entah terjadi error

<?php

set_error_handler('tanganiError');
4 atau tidak.

Mendaftarkan fungsi anonim sebagai shutdown function

Berikut ini contoh untuk mendaftarkan sebuah fungsi anonim sebagai shutdown function. Fungsi ini akan mengambil error terakhir yang terjadi pada saat run-time, lalu akan memanggil fungsi

<?php

set_error_handler('tanganiError');
2 jika memang ada error.

<?php

register_shutdown_function(function () {
    if (error_get_last()) {
        # ambil error terakhir
        $error = (object) error_get_last();

        tanganiError(
            $error->type, $error->message, $error->file, $error->line
        );
    }
});

Coba panggil lagi fungsi

<?php

# variabel $tes tidak ada
echo $tes;
1:

<?php

# fungsi selamatPagi() tidak pernah didefinisikan
selamatPagi();

Hasilnya:

Sembunyikan Semua Output Ketika Terjadi Error

Kita telah berhasil menangani error

<?php

set_error_handler('tanganiError');
4 menggunakan shutdown function. Akan tetapi, jika kita perhatikan, output apa pun sebelum terjadi error akan tetap ditampilkan.

Perhatikan kode program berikut:

<?php

echo "<h1>Selamat Datang</h1>";
echo "<h2>Ini adalah halaman utama</h2>";

# fungsi selamatPagi() tidak pernah didefinisikan
selamatPagi();

echo "<p>Semoga bermanfaat</p>";

Kode program di atas akan menghasilkan output sebagai berikut:

Menggunakan fungsi <?php # variabel $tes tidak ada echo $tes; 3 dan <?php # variabel $tes tidak ada echo $tes; 4

Fungsi

<?php

# variabel $tes tidak ada
echo $tes;
3 akan menyimpan semua output dalam internal buffer PHP. Sehingga output tidak langsung ditampilkan ke dalam browser melainkan akan ditampilkan terakhir-terakhir menjelang program PHP selesai dieksekusi.

Tambahkan fungsi

<?php

# variabel $tes tidak ada
echo $tes;
3 sebelum output pertama, dan panggil fungsi
<?php

# variabel $tes tidak ada
echo $tes;
4 setelah output terakhir.

<?php

ob_start();
echo "<h1>Selamat Datang</h1>";
echo "<h2>Ini adalah halaman utama</h2>";

# fungsi selamatPagi() tidak pernah didefinisikan
selamatPagi();

ob_end_flush();

Panggil fungsi <?php # variabel $tes tidak ada echo $tes; 8 untuk menghapus output

Setelah itu, kita bisa memanggil fungsi

<?php

# variabel $tes tidak ada
echo $tes;
8 untuk menghapus semua output yang terisimpan dalam internal buffer. Dalam artian output tersebut tidak jadi ditampilkan.

Fungsi tersebut kita panggil pada saat teradi error:

<?php

register_shutdown_function(function () {
    if (error_get_last()) {
        # ambil error terakhir
        $error = (object) error_get_last();
        
        # hapus semua output sebelum terjadi error
        ob_end_clean();

        tanganiError(
            $error->type, $error->message, $error->file, $error->line
        );
    }
});

Ketika program kita jalankan lagi, kita akan dapati semua output sebelum terjadi error, ia tidak ditampilkan.

Menangani Sintaks Error

Kita sejauh ini telah berhasil menangani berbagai macam jenis error bahkan sampai fatal error sekalipun.

Akan tetapi, kode program yang telah kita buat di atas tidak bisa menangani sintaks error. Misalkan kita menghapus satu tanda titik koma (

<?php

# fungsi selamatPagi() tidak pernah kita definisikan
selamatPagi();
0), program kita akan error dan fungsi penanganan error yang sudah kita buat tidak akan pernah dipanggil meskipun kita sudah membuat shutdown function.

Lalu, bagaimana cara mengatasi error

<?php

# fungsi selamatPagi() tidak pernah kita definisikan
selamatPagi();
1 alias sintaks error?

Caranya sama saja, yang kita perlu tahu adalah:

  1. Error handle harus tidak ada error
  2. File utama yang dieksekusi tidak boleh ada error
  3. Error sintaks harus berada di file sekunder (selain file utama)

Langsung saja kita praktikkan, kita akan pecah kode program yang telah kita buat sebelumnya menjadi 3 file sebagai berikut:

<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}
0

Penjelasan:

  1. File
    <?php
    
    # fungsi selamatPagi() tidak pernah kita definisikan
    selamatPagi();
    
    2 adalah file utama, yang artinya file tersebut adalah file yang kita request (melalui browser)
  2. Semua error handling kita sendirikan di dalam file
    <?php
    
    # fungsi selamatPagi() tidak pernah kita definisikan
    selamatPagi();
    
    3
  3. File yang berisi sintaks error (atau error apa pun lainnya) kita letakkan pada
    <?php
    
    # fungsi selamatPagi() tidak pernah kita definisikan
    selamatPagi();
    
    4

Berikut adalah kode program file

<?php

# fungsi selamatPagi() tidak pernah kita definisikan
selamatPagi();
2:

<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}
1

Nah ketika di

<?php

# fungsi selamatPagi() tidak pernah kita definisikan
selamatPagi();
4 terdapat error secara sintaks, PHP masih tetap bisa menjalankan file utama yaitu
<?php

# fungsi selamatPagi() tidak pernah kita definisikan
selamatPagi();
2 dan shutdown function yang telah kita definisikan di file
<?php

# fungsi selamatPagi() tidak pernah kita definisikan
selamatPagi();
3 bisa dijalankan.

<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}
2

Kode Program Lengkap

Untuk kode program lengkap pada pertemuan ini bisa anda akses di sini.

Kesimpulan

Di dalam PHP terdapat berbagai jenis level error. Mulai dari yang fatal hingga menghentikan program. Ada yang tidak sampai level tersebut sehingga program masih memungkinkan untuk dilanjutkan.

Untuk menangani error pada PHP, terdapat berbagai macam pendekatan. Dalam pertemuan di atas kita telah menggunakan setidaknya 2 buah pendekatan inti:

  • Menggunakan
    <?php
    
    # fungsi selamatPagi() tidak pernah kita definisikan
    selamatPagi();
    
    9
  • Dan Menggunakan
    <?php
    
    register_shutdown_function(function () {
        if (error_get_last()) {
            # ambil error terakhir
            $error = (object) error_get_last();
    
            tanganiError(
                $error->type, $error->message, $error->file, $error->line
            );
        }
    });
    
    0

Tidak hanya itu, kita juga telah berhasil menyembunyikan semua output yang di-echo sebelum terjadinya error memanfaatkan fungsi

<?php

# variabel $tes tidak ada
echo $tes;
3 dan
<?php

# variabel $tes tidak ada
echo $tes;
8.

Pembahasan Selanjutnya

Pada pembahasan selanjutnya, insyaallah kita masih akan membahas tentang penanganan error. Akan tetapi menggunakan cara yang lebih modern yaitu Exception. Cara ini adalah fitur baru di PHP 5, dan pendekatan ini juga mirip dengan bahasa pemrograman modern lainnya.