YiiはPHP5の例外メカニズムを元にした完全なエラーハンドリングを提供します。 アプリケーションがユーザーのリクエストによって呼び出された時、 アプリケーションはhandleErrorメソッドをPHP warningとnoticeを扱うために登録し、 handleExceptionメソッドをPHP exeptions (例外)を扱うために登録します。したがって、もしアプリケーションの実行時に PHPのwarningやnotice、キャッチされない例外が発生した場合は、 エラーハンドラがコントロールを横取りし、必要なエラーハンドリングの処理を 開始します。
ヒント: エラーハンドラは、アプリケーションのコンストラクタでPHP ファンクションである set_exception_handler と set_error_handler によって 登録されます。もし不要な場合は、entry scriptで
YII_ENABLE_ERROR_HANDLER
とYII_ENABLE_EXCEPTION_HANDLER
の定数をfalse として定義する事で対応できます。
デフォルトではerrorHandler (exceptionHandlerも同様)は onError (またはonException)イベントを発生させます。 これらは、もしエラー(あるいは例外)がイベントハンドラに全く ハンドルされていない場合、errorHandlerアプリケーション コンポーネントから助けを呼びます。
Yiiでの例外は、PHPでの例外と同様です。以下の文法を例外を発生させる為に 使用できます:
throw new ExceptionClass('ExceptionMessage');
Yiiは二つの例外クラスを定義しています。CException と CHttpException です。CHttpException はエンドユーザーへ例外情報を表示するための例外 になっていて、CException はそうでない場合の (エラーを表示せずに処理する場合などの)為の代替案です。また、 CHttpException はHTTPステータスコードを提供する statusCode プロパティを持っています。 例外クラスは次章で述べるように、例外を表示するかどうかを決定します。
ヒント: CHttpExceptionにおける例外の発生はユーザの入力ミスを 報告するのにシンプルな方法です。例えば、もしユーザーが不正なpost IDのURLを 要求した場合、以下のように404error (page not found) をシンプルに表示する 事が出来ます:
// もし要求されたpost IDが不正な場合
throw new CHttpException(404,'The specified post cannot be found.');
エラーの処理が CErrorHandler アプリケーションコンポーネントまで
流れてくると、エラーを表示する為に相応しい ビュー が選ばれます。
もしエラーがCHttpExceptionのように、エンドユーザーへ表示するタイプの
ものだった場合、errorXXX
といった様な名前の ビュー が使用され、この
XXX
の部分はHTTPステータスコード(例えば400, 404, 500など)を表します。
もしエラーが内部的なもので、開発者にのみ表示するべきものであった場合、
exeptions
という名前のビューが使用されます。その場合は、エラーの
起きている行番号をや完全なコールスタック(ファイルの階層情報など)が
表示されます。
情報: アプリケーションがproduction modeで実行された時、内部的なエラーを 含む全てのエラーは
errorXXX
という view を使用して表示されます。 こうなっているのは、エラーのコールスタックが機密に関わる情報を含む可能性が ある為です。このモードでは、開発者はエラーの真の原因を究明する為に、 エラーログに頼ることになるでしょう。
CErrorHandler は下記の順序で対応する view ファイルを探します:
WebRoot/themes/ThemeName/views/system
: これは
現在アクティブになっているテーマの中の system
ビューディレクトリです。
WebRoot/protected/views/system
: これはアプリケーションの
デフォルトの system
ビューディレクトリです。
yii/framework/views
: これはYiiフレームワークによって供給される
標準のシステムビューディレクトリです。
したがって、もしエラーの表示をカスタマイズしたい場合は、アプリケーションか
テーマのシステムビューディレクトリーにエラービューファイルを作成する事で
容易に実現可能です。それぞれのビューファイルは、大部分がHTMLコードで
成り立った通常のPHPスクリプトです。詳細はframeworkのview
ディレクトリの
デフォルトのビューファイルを参考にして下さい。
1.0.6からはコントローラアクションcontroller actionを用いた エラー表示を受け付けます。 これを行うために、アプリケーション構成ファイル中のエラーハンドラを以下のように構成します。
return array(
......
'components'=>array(
'errorHandler'=>array(
'errorAction'=>'site/error',
),
),
);
上記において、CErrorHandler::errorActionプロパティはsite/error
を示すように
します。これはSiteController
コントローラのerror
アクションを意味します。
もし違う名前のコントローラ/アクションを使いたい場合はそれを用いても構いません。
error
アクションは以下のように記述されます。
public function actionError()
{
if($error=Yii::app()->errorHandler->error)
$this->render('error', $error);
}
このアクションにおいて、最初に詳細なエラー情報をCErrorHandler::errorから入手します。
もしこれが空でない場合は、このエラー情報にもとづきerror
ビューを表示します。
CErrorHandler::errorで返されるエラー情報は以下のフィールドを持つ配列です。
code
: HTTPステータスコード (例: 403, 500);type
: エラータイプ (例: CHttpException, PHP Error
);message
: エラーメッセージfile
: エラーの起きたPHPスクリプトファイル名line
: エラーの起きた行番号trace
: エラーのコールスタックsource
: エラーの起きたソースコードヒント: CErrorHandler::errorが空であるかないかをチェックする理由は、
error
アクションは、エラーが無い場合でもエンドユーザによって要求されることがあるためです。$error
配列をビューに渡す場合、それは自動的に個々の変数に展開されます。従って、ビューにおいては それらの変数は例えば$code
,$type
のように直接アクセスすることができます。
エラーが発生した際、error
レベルのメッセージは常に記録されます。
もしPHP warningかnoticeによってエラーが発生した場合、メッセージは
カテゴリー php
と共に記録されます。もしエラーが
キャッチされていない例外として発生した際、カテゴリーは
exception.ExceptionClassName
の様になるでしょう。
(CHttpExceptionにおけるstatusCode もまた
カテゴリーに追加されるでしょう。)
このようにアプリケーションの実行の間に起きるエラーをモニターする為の
logging機能を利用することが出来ます。
Signup or Login in order to comment.