Selamat datang di bagian ke-58 dari seri tutorial pemrograman PHP kita! Di bagian ini, kita akan menyelami dunia advanced error handling dengan menggunakan custom exception classes. Error handling yang baik sangat penting untuk membuat aplikasi yang robust dan mudah dipelihara. Kita akan melangkah lebih jauh dari sekadar menggunakan exception bawaan PHP. Sebelum melanjutkan, pastikan Anda memahami konsep dasar exception dan try-catch blocks. Sebaiknya Anda juga sudah familiar dengan 'Mastering PHP Namespaces for Code Organization' karena kita akan menggunakannya untuk mengorganisir exception class kita.
Bayangkan Anda sedang membangun sebuah rumah. Jika tukang batu melakukan kesalahan (misalnya, salah menghitung jumlah batu bata), itu adalah sebuah kesalahan. PHP exceptions berfungsi seperti alarm yang berbunyi saat terjadi kesalahan. Namun, exception bawaan PHP mungkin tidak cukup spesifik untuk kebutuhan aplikasi Anda. Custom exception classes memungkinkan Anda membuat alarm yang lebih spesifik, yang membawa informasi lebih detail tentang jenis kesalahan yang terjadi. Analogi sederhananya, exception bawaan seperti alarm kebakaran umum, sedangkan custom exception seperti alarm yang membedakan antara kebakaran kompor dan kebakaran korsleting listrik.
catch blocks untuk menangkap exception tertentu saja.Mari kita buat custom exception class untuk menangani kesalahan terkait database. Kita akan menggunakan namespace untuk mengorganisir kode kita.
Buat sebuah file bernama DatabaseException.php di dalam folder src/Exceptions. Asumsikan struktur direktori Anda seperti ini:
project/
├── src/
│ ├── Exceptions/
│ │ └── DatabaseException.php
│ └── ...
└── ...
Isi file DatabaseException.php dengan kode berikut:
$this->code,
'error_message' => $this->message,
'timestamp' => date('Y-m-d H:i:s'),
];
}
}
Penjelasan Kode:
namespace MyApp\Exceptions;: Mendefinisikan namespace untuk exception class kita.use Exception;: Mengimpor class Exception bawaan PHP.class DatabaseException extends Exception: Membuat class DatabaseException yang mewarisi dari class Exception.__construct(): Constructor untuk class exception. Menerima pesan error, kode error, dan exception sebelumnya (jika ada).getErrorDetails(): Method untuk mendapatkan detail error dalam bentuk array. Ini sangat berguna untuk logging dan debugging.Berikut adalah contoh bagaimana menggunakan DatabaseException:
getErrorDetails();
error_log("Database Error: " . json_encode($errorDetails));
echo "Terjadi kesalahan database. Silakan hubungi administrator.";
} catch (\Exception $e) {
// Tangani exception lain secara umum
error_log("General Error: " . $e->getMessage());
echo "Terjadi kesalahan. Silakan coba lagi nanti.";
}
}
connectToDatabase('localhost', 'user', 'password', 'mydb');
Penjelasan Kode:
use MyApp\Exceptions\DatabaseException;: Mengimpor class DatabaseException dari namespace.try-catch block: Mencoba melakukan koneksi database. Jika gagal, DatabaseException akan di-throw.catch (DatabaseException $e): Menangkap DatabaseException secara spesifik. Ini memungkinkan kita untuk menangani kesalahan database secara berbeda dari kesalahan lainnya.$e->getErrorDetails(): Memanggil method getErrorDetails() untuk mendapatkan detail error.catch (\Exception $e): Menangkap semua exception lain yang tidak tertangkap oleh catch (DatabaseException $e).catch (\Exception $e) dan tidak menangani exception secara spesifik. Ini membuat debugging menjadi sulit.Buat custom exception class untuk menangani kesalahan terkait validasi data (misalnya, ValidationException). Class ini harus memiliki method untuk mendapatkan daftar field yang tidak valid dan pesan error untuk setiap field.