0 follower

Penanganan Error

Yii menyediakan kerangka kerja penanganan error yang lengkap berdasarkan pada mekanisme exception PHP 5. Saat aplikasi dibuat untuk menangani permintaan pengguna yang masuk, ia meregistrasi metode handleError untuk menangani peringatan dan pemberitahuan PHP; dan meregistrasi metode handleException guna menangani exception PHP yang tidak tertangkap. Konsekuensinya, jika peringatan/pemberitahuan PHP atau exception yang tidak tertangkap terjadi selama eksekusi aplikasi, salah satu pengendali error akan mengambil alih kontrol dan memulai prosedur penanganan error tertentu.

Tip: Registrasi pengendali error dikerjakan dalam pembentuk aplikasi dengan memanggil fungsi PHP set_exception_handler dan set_error_handler. Jika Anda tidak menginginkan Yii menangani error dan exception, Anda dapat mendefinisikan constant YII_ENABLE_ERROR_HANDLER dan YII_ENABLE_EXCEPTION_HANDLER menjadi false dalam skrip entri.

Secara default, handlerError (atau handleException) akan memunculkan event onError (atau event onException). Jika error (atau exception) tidak ditangani oleh pengendali event manapun, ia akan memanggil bantuan dari komponen aplikasi errorHandler.

1. Memunculkan Exception

Memunculkan exception dalam Yii tidak berbeda dengan memunculkan exception normal PHP. Anda menggunakan sintaks berikut untuk memunculkan exception bila diperlukan:

throw new ExceptionClass('ExceptionMessage');

Yii mendefinisikan tiga kelas exception: CException, CDbException dan CHttpException. CException adalah kelas exception generik. CDbException mewakiliki exception yang diakibatkan oleh operasi berhubungan dengan DB. CHttpException merupakan exception yang harus ditampilkan kepada pengguna akhir dan membawa sebuah properti statusCode mewakili status kode HTTP Kelas exception menentukan bagaimana ia harus ditampilkan, seperti yang akan dijelaskan nanti.

Tip: Memunculkan exception CHttpException adalah cara mudah pelaporan error yang disebabkan oleh error pengguna mengoperasikan. Sebagai contoh, jika pengguna menyediakan ID tulisan tidak benar dalam URL, kita dapat melakukan hal berikut untuk menampilkan error 404 (halaman tidak ditemukan):

// jika ID tulisan tidak benar
throw new CHttpException(404,'The specified post cannot be found.');

2. Menampilkan error

Ketika error dioperkan ke komponen aplikasi CErrorHandler, ia memilih tampilan yang sesuai untuk menampilkan error. Jika error bertujuan untuk ditampilkan kepada pengguna akhir, seperti misalnya CHttpException, ia akan menggunakan tampilan bernama errorXXX, di mana XXX adalah kode status HTTP (misalnya 400, 404, 500). Jika error adalah error internal dan seharusnya hanya ditampilkan kepada pengembang, ia akan menggunakan tampilan bernama exception. Jika kasus yang kedua, informasi jejak panggilan juga baris error akan ditampilkan.

Info: Ketika aplikasi berjalan dalam mode produksi, semua error termasuk yang internal akan ditampilkan menggunakan tampilan errorXXX. Ini dikarenakan jejak panggilan error mungkin berisi informasi yang sensitif. Dalam hal ini, pengembang harus bergantung pada log error untuk menentukan penyebab error sebenarnya.

CErrorHandler mencari file tampilan terkait untuk sebuah tampilan dengan urutan sebagai berikut:

  1. WebRoot/themes/ThemeName/views/system: ini adalah direktori tampilan system di bawah tema yang aktif saat ini.

  2. WebRoot/protected/views/system: ini adalah direktori tampilan system di bawah aplikasi.

  3. yii/framework/views: ini adalah direktori tampilan sistem standar yang disediakan oleh Yii framework.

Oleh karena itu, jika kita ingin mengkustomisasi tampilan error, kita cukup membuat file tampilan error di bawah direktori tampilan sistem pada aplikasi atau tema Anda. Setiap file tampilan adalah skrip PHP normal yang berisi kode HTML. Untuk lebih jelasnya, silahkan merujuk ke file tampilan standar framework di bawah direktori view.

3. Penanganan Error dengan Penggunaan Action

Yii memungkinkan kita menggunakan sebuah action dari controller untuk menangani tugas penampilan error. Untuk itu, kita harus mengatur error handler(penanganan error) dalam konfigurasi aplikasi:

return array(
    ......
    'components'=>array(
        'errorHandler'=>array(
            'errorAction'=>'site/error',
        ),
    ),
);

Pada kode di atas, kita mengkonfigurasi properti CErrorHandler::errorAction untuk menjadi rute site/error yang merujuk action error di SiteController. Kita akan menggunakan rute yang berbeda apabila diperlukan

Kita dapat menulis action error seperti berikut:

public function actionError()
{
    if($error=Yii::app()->errorHandler->error)
        $this->render('error', $error);
}

Pada action, kita pertama mengambil informasi error yang detail dari CErrorHandler::error. Jika properti tersebut tidak kosong, kita akan menampilkan view error bersama dengan informasi error. Informasi error yang dikembalikan dari CErrorHandler::error adalah sebuah larik(array) dengan field-field berupa:

  • code: kode status HTTP (misalnya 403, 500);
  • type: Jenis error (misalnya CHttpException, PHP Error);
  • message: pesan error;
  • file: nama file skrip PHP yang mengalami error;
  • line: nomor baris yang menyebabkan error;
  • trace: call stack dari error tersebut;
  • source: kode sumber(source code) konteks di tempat error terjadi..

Tip: Alasan kita mengecek apakah CErrorHandler::error kosong atau tidak dikarenakan action error bisa saja di-request oleh end user secara langsung yang berarti tidak ada error. Karena kita sedang melemparkan larik(array) $error ke view, kita akan memperluas variabel individu secara otomatis. Sebagai hasilnya, kita dapat mengakses variabel-variabel $code, $type secara langsung di view.

4. Pencatatan Message(Pesan)

Pesan tingkat error akan selalu dicatat bila terjadi kesalahan. Jika error disebabkan oleh peringatan atau pemberitahuan PHP, pesan akan dicatat dengan kategori php; jika error disebabkan oleh exception tidak tertangkap, kategori akan menjadi exception.ExceptionClassName (untuk CHttpException statusCode juga akan ditambahkan ke kategori). Selanjutnya Anda dapat mengeksploitasi fitur pencatatan untuk memonitor error yang terjadi selama eksekusi aplikasi.

Found a typo or you think this page needs improvement?
Edit it on github !