Debugging dan Error Handling di NexaUI Framework

Pengenalan

Debugging dan error handling adalah aspek penting dalam pengembangan aplikasi. NexaUI Framework menyediakan berbagai tools dan teknik untuk membantu Anda mengidentifikasi, melacak, dan menyelesaikan masalah dalam aplikasi Anda.

Mode Debug

NexaUI memiliki mode debug yang dapat diaktifkan melalui file .env:

APP_DEBUG=true

Ketika mode debug aktif:

  • Error dan exception ditampilkan dengan detail lengkap
  • Stack trace ditampilkan untuk membantu melacak sumber error
  • Query database dicatat dan dapat ditampilkan
  • Informasi performa aplikasi tersedia

Untuk lingkungan produksi, pastikan mode debug dinonaktifkan:

APP_DEBUG=false

Dalam mode produksi, error tidak ditampilkan ke pengguna, tetapi dicatat ke log.

NexaDebug Class

NexaUI menyediakan class NexaDebug yang menawarkan berbagai metode untuk debugging:

use App\System\Helpers\NexaDebug;

// Menampilkan variabel dengan format yang mudah dibaca
NexaDebug::dump($variable);

// Menampilkan variabel dan menghentikan eksekusi
NexaDebug::dd($variable);

// Menampilkan backtrace
NexaDebug::backtrace();

// Mencatat pesan ke log
NexaDebug::log('Pesan debug', 'info');

// Mengukur waktu eksekusi
NexaDebug::startTimer('query');
// ... kode yang akan diukur
$executionTime = NexaDebug::endTimer('query');

Error Handling

NexaUI menggunakan sistem error handling yang komprehensif yang menangkap dan mengelola exception dan error. Sistem ini diinisialisasi di index.php:

// index.php
try {
    // Initialize Nexa
    $nexa = Nexa::getInstance();
    
    // Initialize debug system
    NexaDebug::init();
    NexaDebug::setErrorHandler();   
    
    // Run the application
    $nexa->Tatiye()->run();
} catch (Exception $e) {
    // Handle fatal errors
    $debugMode = ($_ENV['APP_DEBUG'] ?? 'false') === 'true';
    if ($debugMode) {
        echo "

Fatal Error

"; echo "

Message: " . $e->getMessage() . "

"; echo "

File: " . $e->getFile() . " on line " . $e->getLine() . "

"; echo "
" . $e->getTraceAsString() . "
"; } else { echo "

Something went wrong

"; echo "

Please try again later.

"; } // Log error if (function_exists('error_log')) { error_log($e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine()); } }

Custom Exception Handling

Anda dapat membuat custom exception handler untuk menangani jenis exception tertentu:

// Mendefinisikan custom exception
class ValidationException extends Exception {}

// Di controller
try {
    $validation = $this->validate($data);
    if (!$validation->passes()) {
        throw new ValidationException('Validation failed');
    }
} catch (ValidationException $e) {
    // Handle validation error
    return $this->redirectWithErrors('/form', $validation->errors());
} catch (Exception $e) {
    // Handle other exceptions
    NexaDebug::log($e->getMessage(), 'error');
    return $this->error500();
}

Logging

NexaUI menyediakan sistem logging yang fleksibel untuk mencatat informasi, peringatan, dan error. Log disimpan di direktori system/log/.

Level Log

Sistem logging mendukung berbagai level:

  • debug - Informasi detail untuk debugging
  • info - Informasi umum
  • notice - Kejadian normal tapi signifikan
  • warning - Peringatan (tidak fatal)
  • error - Error runtime
  • critical - Kondisi kritis
  • alert - Tindakan harus diambil segera
  • emergency - Sistem tidak dapat digunakan

Menggunakan Logger

use App\System\Helpers\NexaDebug;

// Log dengan level default (info)
NexaDebug::log('User logged in: ' . $user->email);

// Log dengan level tertentu
NexaDebug::log('Database connection failed', 'error');

// Log dengan konteks tambahan
NexaDebug::log('Payment processed', 'info', [
    'user_id' => $user->id,
    'amount' => $payment->amount,
    'status' => $payment->status
]);

Konfigurasi Log

Konfigurasi logging dapat diatur di system/Config/logging.php:

return [
    // Default log channel
    'default' => 'daily',

    // Log channels
    'channels' => [
        'single' => [
            'driver' => 'single',
            'path' => SYSTEM_PATH . '/log/nexa.log',
            'level' => 'debug',
        ],
        'daily' => [
            'driver' => 'daily',
            'path' => SYSTEM_PATH . '/log/nexa.log',
            'level' => 'debug',
            'days' => 14,
        ],
        'slack' => [
            'driver' => 'slack',
            'url' => 'your-slack-webhook-url',
            'username' => 'NexaUI Logger',
            'emoji' => ':boom:',
            'level' => 'critical',
        ],
    ],
];

Debug Bar

NexaUI menyertakan Debug Bar yang menampilkan informasi debugging di bagian bawah halaman ketika mode debug aktif. Debug Bar menampilkan:

  • Waktu eksekusi dan penggunaan memori
  • Query database yang dijalankan
  • Request dan response data
  • Session dan cache data
  • Loaded files

Debug Bar dapat diaktifkan di .env:

APP_DEBUG_BAR=true

Error Pages

NexaUI menyediakan halaman error default untuk HTTP error umum. Anda dapat menyesuaikan halaman-halaman ini dengan membuat file di direktori templates/:

  • templates/404.html - Not Found
  • templates/500.html - Internal Server Error
  • templates/403.html - Forbidden
  • templates/401.html - Unauthorized

Contoh halaman 404 kustom:

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page Not Found</title>
    <link rel="stylesheet" href="https://tatiye.net/assets/css/style.css">
</head>
<body>
    <div class="container error-page">
        <h1>404 - Page Not Found</h1>
        <p>Maaf, halaman yang Anda cari tidak ditemukan.</p>
        <p><a href="{link/}">Kembali ke Beranda</a></p>
    </div>
</body>
</html>

Tips Debugging

  1. Periksa Log Files
    Log files adalah sumber informasi yang berharga untuk debugging. Periksa file di system/log/ untuk melihat error dan warning.
  2. Gunakan NexaDebug::dump()
    Fungsi ini lebih informatif daripada var_dump() dan memformat output agar lebih mudah dibaca.
  3. Aktifkan Query Logging
    Untuk debug masalah database, aktifkan query logging:
    NexaDebug::enableQueryLog();
    // ... kode dengan query database
    $queries = NexaDebug::getQueryLog();
    NexaDebug::dump($queries);
  4. Gunakan Try-Catch untuk Error Handling
    Selalu bungkus kode yang berpotensi menimbulkan error dalam blok try-catch untuk menangani error dengan elegan.
  5. Periksa HTTP Headers dan Response
    Untuk debugging API, periksa HTTP headers dan response body:
    NexaDebug::dump($this->request->headers);
    NexaDebug::dump($this->response->getBody());