0 follower

エラーハンドリング

YiiはPHP5の例外メカニズムを元にした完全なエラーハンドリングを提供します。 アプリケーションがユーザーのリクエストによって呼び出された時、 アプリケーションはhandleErrorメソッドをPHP warningとnoticeを扱うために登録し、 handleExceptionメソッドをPHP exeptions (例外)を扱うために登録します。したがって、もしアプリケーションの実行時に PHPのwarningやnotice、キャッチされない例外が発生した場合は、 エラーハンドラがコントロールを横取りし、必要なエラーハンドリングの処理を 開始します。

ヒント: エラーハンドラは、アプリケーションのコンストラクタでPHP ファンクションである set_exception_handlerset_error_handler によって 登録されます。もし不要な場合は、entry scriptYII_ENABLE_ERROR_HANDLERYII_ENABLE_EXCEPTION_HANDLERの定数をfalse として定義する事で対応できます。

デフォルトではerrorHandlerexceptionHandlerも同様)は onError (またはonException)イベントを発生させます。 これらは、もしエラー(あるいは例外)がイベントハンドラに全く ハンドルされていない場合、errorHandlerアプリケーション コンポーネントから助けを呼びます。

1. 例外の発生

Yiiでの例外は、PHPでの例外と同様です。以下の文法を例外を発生させる為に 使用できます:

throw new ExceptionClass('ExceptionMessage');

Yiiは二つの例外クラスを定義しています。CExceptionCHttpException です。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.');

2. エラーの表示

エラーの処理が CErrorHandler アプリケーションコンポーネントまで 流れてくると、エラーを表示する為に相応しい ビュー が選ばれます。 もしエラーがCHttpExceptionのように、エンドユーザーへ表示するタイプの ものだった場合、errorXXX といった様な名前の ビュー が使用され、この XXX の部分はHTTPステータスコード(例えば400, 404, 500など)を表します。 もしエラーが内部的なもので、開発者にのみ表示するべきものであった場合、 exeptions という名前のビューが使用されます。その場合は、エラーの 起きている行番号をや完全なコールスタック(ファイルの階層情報など)が 表示されます。

情報: アプリケーションがproduction modeで実行された時、内部的なエラーを 含む全てのエラーは errorXXX という view を使用して表示されます。 こうなっているのは、エラーのコールスタックが機密に関わる情報を含む可能性が ある為です。このモードでは、開発者はエラーの真の原因を究明する為に、 エラーログに頼ることになるでしょう。

CErrorHandler は下記の順序で対応する view ファイルを探します:

  1. WebRoot/themes/ThemeName/views/system: これは 現在アクティブになっているテーマの中の system ビューディレクトリです。

  2. WebRoot/protected/views/system: これはアプリケーションの デフォルトの system ビューディレクトリです。

  3. 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のように直接アクセスすることができます。

3. メッセージのログ処理

エラーが発生した際、error レベルのメッセージは常に記録されます。 もしPHP warningかnoticeによってエラーが発生した場合、メッセージは カテゴリー php と共に記録されます。もしエラーが キャッチされていない例外として発生した際、カテゴリーは exception.ExceptionClassNameの様になるでしょう。 (CHttpExceptionにおけるstatusCode もまた カテゴリーに追加されるでしょう。) このようにアプリケーションの実行の間に起きるエラーをモニターする為の logging機能を利用することが出来ます。