エラーハンドリング(Error Handling)

アプリケーションにおいて、修復不可能なエラーが発生した場合、処理を停止し、ユーザへエラーメッセージを表示することが一般的です。それぞれのコントローラとコンポーネントにおいて、独自のハンドリングを作成する手間を省くため、あらかじめ提供されているメソッドを使用することができます。

$this->cakeError(string $errorType [, array $parameters]);

このメソッドを呼び出すと、ユーザへエラーページが表示され、アプリケーションのこれより後のあらゆる処理が停止されます。

parameters は、文字列型のみを含む配列でなければなりません。もし配列の中にオブジェクト(例外クラスも含みます)があった場合、文字列型へ変換されます。

CakePHP はエラータイプのセットをあらかじめ定義していますが、コードを書くにあたって、ほとんどのエラータイプはフレームワークそのものにおいてのみ便利です。アプリケーションの開発者にとって、最も使い勝手の良いものは、古き良き 404 エラーでしょう。これは、次のように引数無しで呼び出すことができます:

$this->cakeError('error404');

また他に、 url パラメータを渡すことで、ある特別な URL で発生したエラーであることを報告するためのページを表示することができます:

$this->cakeError('error404', array('url' => 'some/other.url'));

独自のエラータイプを使うためにエラーハンドラを拡張すると、より便利になってきます。独自のエラーハンドラは、コントローラのアクションによく似ています。例によって、ビューで変数が利用できるようにするため set() で渡し、app/views/errors ディレクトリのビューファイルを出力します。

app/app_error.php に次のように定義をおこなったファイルを作成してください。

<?php
class AppError extends ErrorHandler {
}
?>

新しいエラータイプのハンドラは、このクラスにメソッドを追加することで実行可能になります。エラータイプとして使いたい名前のメソッドを、ただ単純に作成します。

いくつかのファイルをディスクに書き込むアプリケーションがあるとしましょう。書き込みエラーが発生したら、ユーザにそれを通知することが適切です。これらのコードを、アプリケーションのあちこちに追加することは望ましくありませんので、このケースは新しいエラータイプを使用することが望ましいケースです。

AppError クラスに新しいメソッドを追加してください。書き込みに失敗したファイルのパスを表す file というパラメータを使ってみましょう。

function cannotWriteFile($params) {
  $this->controller->set('file', $params['file']);
  $this->_outputMessage('cannot_write_file');
}

app/views/errors/cannot_write_file.ctp にビューを作成します。

<h2>ファイルを読み込めません。</h2>
<p>ディスクから <?php echo $file ?> が読み込めませんでした。</p>

次に controller/component へエラーを投げます。

$this->cakeError('cannotWriteFile', array('file'=>'somefilename'));

$this->_outputMessage(<view-filename>) のデフォルトの動作は、 views/errors/<view-filename>.ctp を、ただ表示するだけです。この振る舞いを上書きするには、 AppError クラスで _outputMessage($template) を再定義します。