エラーハンドリング

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 として定義する事で対応できます。

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

1. 例外の発生

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

throw new ExceptionClass('ExceptionMessage');

Yiiは三つの例外クラスを定義しています。CExceptionCDbException、そして CHttpException です。CException は包括的な例外クラスです。CDbException は データベースに関係する何らかの操作によって引き起こされた例外を表します。 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ディレクトリの デフォルトのビューファイルを参考にして下さい。

3. アクションを用いたエラーハンドリング

Yiiではコントローラアクション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のように直接アクセスすることができます。

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

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

$Id: topics.error.txt 3374 2011-08-05 23:01:19Z alexander.makarow $

Be the first person to leave a comment

Please to leave your comment.