トップページ > 1. ドキュメント > 1.2. CharcoalPHPの基本 > 1.2.1. 基本知識 > 例外処理と例外ハンドラ

例外処理と例外ハンドラ

例外とは

 例外(exception)とは実行時に発生する予期しないエラーのことを指します。PHP5ではExceptionというクラスが定義されており、Exceptionの派生クラスを定義してそのインスタンスをthrowキーワードを使ってスローすることで、任意に例外を発生させることができます。例外が発生した場合、try-catch構文で以下のように例外を補足することができますが、どの呼び出し階層でも例外がキャッチされなかった場合にはPHPプログラムの実行はストップします。

 CharcoalPHPではCharcoal_CharcoalExceptionという独自の例外クラスを定義していて、この派生クラスを定義することでフレームワークがアプリケーションコードの例外を補足します。補足された例外は後述の例外ハンドラに渡され、例外のタイプごとに処理されます。

タスク内で例外が発生した場合

 ユーザが作成したタスク内のコードで例外が発生した場合、フレームワークは以下の順で処理します。

  1. タスク内のcatch節で処理
  2. フレームワーク側のcatch節で例外を補足
  3. 例外ハンドラ(後述)が登録されていれば例外ハンドラに処理を委譲(例外が処理されればそこで終了)
  4. 例外ハンドラが登録されていないか登録された例外ハンドラで例外が処理されなければ、例外スタックとコールスタックを表示して終了

 また、ユーザが作成、またはサードパーティ製のライブラリで例外またはエラーが発生した場合はフレームワークで補足できる場合は例外ハンドラに処理が委譲されます(PHPエラーをフレームワークが検知した場合、フレームワークはCharcoal_PHPErrorException例外を発生させ、例外ハンドラをコールします)。

例外ハンドラ

 CharcoalPHPで前述のCharcoal_CharcoalExceptionと例外ハンドラを使用してエラー処理を実装することを推奨しています。例外ハンドラにはhttp_defaultなどの組み込みオブジェクトもありますが、Charcoal_IExceptionHandlerインタフェースを実装するクラスを書くことで独自の例外ハンドラを実装することもできます。

 例外ハンドラを使うことで、以下のようなことが実現できます。

  • 複数のタスクで共通な処理を実装する(認証エラーの場合、ログイン画面にリダイレクトするなど)
  • ユーザに例外のタイプによって特定のメッセージを表示する
  • 例外のタイプによってHTTPステータスを変更する
  • 独自のログを出力する(例えば管理者にメールを送信するなど)

 例外ハンドラを使わず、タスクを実装することももちろんできますが、タスク内もしくはタスクが使用しているライブラリやコンポーネント内から例外がスローされた場合、その例外をcatchして処理するのはプログラマの責務になります。例外がタスク内でcatchされない場合、その例外はフレームワーク側でcatchされます。

 例外ハンドラは設定ファイルによってアプリケーションごとに複数定義することができます。定義された例外ハンドラはリクエストの実行処理の初期段階ですべて登録されます。例外発生時にタスク内でキャッチされなかった例外はすべてフレームワークで一旦catchされ、登録された例外ハンドラに順番に渡されます。その際、以下の2種類の例外タイプによって例外ハンドラの特定のメソッドが呼ばれます。

例外の型とそれに対応する例外ハンドラのメソッド
例外のタイプ 呼び出される例外ハンドラのメソッド
Exception Charcoal_IExceptionHandler#handleException


このように、CharcoalPHPでは処理を継続できないようなケースにおいて例外ハンドラで例外処理することが推奨されています(AJAXのように、処理が継続できない場合でもレスポンスを返さなければならないケースでは例外ハンドラを使わないという選択肢も有り得ます)。

Pocket

Comments are closed.