Penanganan Kesalahan dan Pencatatan

Jika kita mencoba mengakses URL http://hostname/blog/index.php?page=EditPost&id=100, kita akan melihat halaman kesalahan berikut karena tulisan dengan ID 100 belum ada dalam sistem blog kita. Kita ingin mengkustomisasi halaman kesalahan ini agar ia terlihat lebih konsisten dengan tata letak halaman blog lain. Kita juga ingin mencatat jenis kesalahan ini untuk mempelajari kebiasaan pengguna. Dalam bagian ini, kita akan melaksanakan dua tugas ini.

Tugas penting dalam aplikasi Web adalah penanganan kesalahan yang sering dikaitkan dengan pencatatan. Ada dua jenis kesalahan yang bisa terjadi dalam aplikasi PRADO: yang disebabkan oleh para pengembang dan yang disebabkan oleh pengguna-akhir. Pembentuk harus dipecahkan sebelum aplikasi dijadikan tahap produksi, sementara yang terakhir biasanya di dalam lingkup desain awal dan harus ditangani dengan baik (misalnya mencatat kesalahan dan menampilkan halaman khusus yang menginstruksikan pengguna-akhir apa yang harus dilakukan selanjutnya). PRADO mengimplementasikan kerangka kerja yang fleksibel serta bertenaga untuk menangani kesalahan dan pencatatan.

Mengkustomisasi Penanganan Kesalahan

PRADO secara implisit mengambil modul TErrorHandler untuk menangani kesalahan. Kita ingin mengkustomisasi modul ini agar sistem blog kita dapat menampilkan halaman terkustomisasi untuk kesalahan yang disebabkan oleh pengguna-akhir. Selanjutnya memodifikasi konfigurasi aplikasi seperti berikut:

...... ...... ...... ......

Kelas BlogErrorHandler seperti ditetapkan di atas adalah modul pengendali kesalahan baru as yang akan dibuat berikutnya. Ia memperluas dan mengganti modul standar TErrorHandler.

Kita membuat sebuah file bernama protected/BlogErrorHandler.php seperti berikut. Kelas BlogErrorHandler mengganti dua metode TErrorHandler:

Prado::using('System.Exceptions.TErrorHandler'); Prado::using('Application.BlogException'); class BlogErrorHandler extends TErrorHandler { /** * Mengambil template yang dipakai untuk menampilkan eksepsi eksternal. * Metode ini mengganti implementasi leluhurnya. */ protected function getErrorTemplate($statusCode,$exception) { // gunakan template sendiri untuk BlogException if($exception instanceof BlogException) { // ddapatkan path file template kesalahan: protected/error.html $templateFile=Prado::getPathOfNamespace('Application.error','.html'); return file_get_contents($templateFile); } else // sebaliknya gunakan template yang didefinisikan oleh PRADO return parent::getErrorTemplate($statusCode,$exception); } /** * Menangani kesalahan eksternal yang disebabkan oleh pengguna-akhir. * Metode ini mengganti implementasi leluhurnya. * Ini dipanggil oleh PRADO saat eksepsi eksternal dikeluarkan. */ protected function handleExternalError($statusCode,$exception) { // catat kesalahan (hanya untuk BlogException) if($exception instanceof BlogException) Prado::log($exception->getErrorMessage(),TLogger::ERROR,'BlogApplication'); // panggil implementasi leluhur untuk menampilkan kesalahan parent::handleExternalError($statusCode,$exception); } }

Dalam kode di atas, kita menetapkan bahwa saat BlogException dikeluarkan, kita menggunakan template baru protected/error.html untuk menampilkan kesalahan. Oleh karena itu, kita perlu membuat kelas BlogException dan mengganti semua THttpException yang ada dalam kode kita (seperti misalnya EditUser dan halaman ReadPost). Kita juga perlu membuat template kesalahan protected/error.html. Kelas BlogException memperluas THttpException dan kosong. File kelas disimpan sebagai protected/BlogException.php.

class BlogException extends THttpException { }

Di bawah ini konten dalam template kesalahan kita protected/error.html. Catatan, template bukan template PRADO karena ia hanya mengenal jumlah token yang sangat terbatas, seperti %%ErrorMessage%%, %%ServerAdmin%%.

%%ErrorMessage%%

%%ErrorMessage%%

The above error happened when the server was processing your request.

If you think this is a server error, please contact the webmaster.

Mencatat Kesalahan

Dalam metode handleExternalError() pada BlogErrorHandler, kita memanggil Prado::log() untuk mencatat kesalahan jika tipenya adalah BlogException. Kesalahan dicatat dalam memori. Untuk menyimpan catatan ke dalam medium permanen seperti file atau database, kita perlu menghidupkan rute pencatatan kesalahan yang sesuai. Ini dikerjakan dalam konfigurasi aplikasi seperti berikut:

...... ...... ...... ......

Dalam konfigurasi di atas, kita menambahkan rute log yang menyimpan catatan ke dalam sebuah file. Kita juga menetapkan filter kategori sebagai BlogApplication agar hanya mencatat pesan pada kategori yang dipilih yang disimpan. Ini membantu mengurangi ukuran file catatan dan juga meningkatkan pembacaannya.

Pengujian

Untuk melihat bagaimana sistem blog kita merespon permintaan tidak benar dari pengguna, kita menguji URL http://hostname/blog/index.php?page=posts.ReadPost&id=100. Kita akan melihat halaman kesalahan berikut yang berbeda dari apa yang telah kita lihat sebelumnya.

Jika kita mencari di bawah direktori protected/runtime, kita akan menemukan file bernama prado.log. Ini adalah file log yang baru dikonfigurasi untuk menyimpan pesan kesalahan. File dapat berisi konten seperti berikut,

Jun 28 22:15:27 [Error] [BlogApplication] Unable to find the specified post. Jun 29 08:42:57 [Error] [BlogApplication] Unable to find the specified post.