CakePHPのエラー処理(cakeError)

CakePHP1.2のエラーハンドリング方法。
Error Handling :: Common Tasks With CakePHP :: The Manual :: 1.2 Collection :: The Cookbook

Object::cakeError()

基本的に、ObjectクラスのcakeErrorというメソッドを使うらしい。
appディレクトリ以下に、error.phpもしくはapp_error.phpというファイルを置いて
ErrorHandlerを継承したAppErrorという名前のクラスを定義すると自分でエラー処理方法を定義できる。

<?php
class AppError extends ErrorHandler {
    function error($params) {
        // エラー処理
    }
}
<?php
$this->cakeError('error', $params); // AppError::error()をcall

ErrorHandler::__construct()

ここで問題が一つ。
デバッグレベルがゼロの場合に(つまり公開時)、ErrorHandlerのコンストラクタで、
error、error404、error500以外のメソッドが呼べないようになっている。
これは公開時、Missing Controllerなどのエラーを出さないためのよう。

<?php
class ErrorHandler extends Object {
    function __construct($method, $messages) {
        // 略
    if (method_exists($this->controller, 'apperror')) {
            return $this->controller->appError($method, $messages);
        }
        // 略
        if ($method !== 'error') {
            if (Configure::read() == 0){ // Configure::read()はDEBUG_LEVELを返す
                $method = 'error404';
                if (isset($code) && $code == 500) {
                    $method = 'error500';
                }
            }
        }
        $this->dispatchMethod($method, $messages);
        $this->_stop();
    }


それ以上エラー出力を分けたい場合には、コンストラクタをオーバーライドするのがよさそう。
また、AppControllerを継承したCakeErrorControllerクラスにappErrorメソッドが定義されていた場合
そちらが優先で呼ばれるので、AppControllerで定義する方法もありかもしれない。
(ただし後者の方法は同じエラーが連続で呼ばれた場合にダメっぽい)