けっこうたくさんある例外クラス

CakePHP2.2.3 の時点で全ての例外クラスは Cake/Error/exceptions.php の中で宣言されています。用意されているExceptionクラスがたくさんあって整理がつかないので一覧表にしてみました。

ちょっと2.3も先取り

先走りですが、2.3からの仕様変更の予定も反映してしまっています。

2.3からは、CakePHPで宣言するすべての例外クラスの基底クラスとして CakeBaseException クラスが新たに導入される模様です。

http://book.cakephp.org/2.0/en/development/exceptions.html

New in version 2.3: CakeBaseException was added

exception CakeBaseException
Base exception class in CakePHP. All CakeExceptions and HttpExceptions above extend this class.

現在は phpコアの RuntimeException クラスを HttpException と CakeException の2系統に分離して継承していますが、両者共通の実装を CakeBaseException に施すらしいです。とりあえずはレスポンスにヘッダを付加するメソッドが実装されるみたいですね。

(※2012/10/29、2.3ベータが公開され、これらの実装が完了しています)

CakePHP例外クラスのクラス図と一覧

2.3 β 現在、CakePHPの例外クラスのクラス図は以下のようになります

CakePHP例外クラスのクラス図

掲載の順番は基本的に exceptions.php に記述されたまんまです。

(※CakeBaseException は 2.3以降の実装です。それ以前のバージョンではHttpExceptionとCakeExceptionはRuntimeExceptionを継承しています。)

クラス名 基底クラス 説明 ステータスコード
CakeBaseException(※) RuntimeException 2.3から導入の全例外クラスの基底クラス
HttpException CakeBaseException(※) HTTP接続にまつわる例外の基底クラス
BadRequestException HttpException 400エラー  400
UnauthorizedException HttpException 401エラー  401
ForbiddenException HttpException 403エラー  403
NotFoundException HttpException 404エラー  404
MethodNotAllowedException HttpException 405エラー  405
InternalErrorException HttpException 500エラー  500
CakeException CakeBaseException(※) CakePHPの本体で発生した例外の基底クラス  500
MissingControllerException CakeException コントローラが無い  404
MissingActionException CakeException アクションが無い  404
PrivateActionException CakeException プライベートアクションを外部から実行  404
MissingComponentException CakeException コンポーネントが無い  500
MissingBehaviorException CakeException ビヘイビアが無い  500
MissingViewException CakeException ビューが無い  500
MissingLayoutException CakeException レイアウトファイルが無い  500
MissingHelperException CakeException ヘルパーが無い  500
MissingDatabaseException CakeException データベースが見つからない  500
MissingConnectionException CakeException データベースの接続が無い  500
MissingTaskException CakeException 実行しようとしたタスクが無い  500
MissingShellMethodException CakeException シェルのメソッドが無い  500
MissingShellException CakeException シェルのクラスが無い  500
MissingDatasourceConfigException CakeException データベースの設定が無い  500
MissingDatasourceException CakeException データソースのクラスが無い  500
MissingTableException CakeException テーブルが無い  500
MissingModelException CakeException モデルが無い  500
MissingTestLoaderException CakeException テストローダが無い  500
MissingPluginException CakeException プラグインが無い  500
MissingDispatcherFilterException CakeException ディスパッチャフィルタが無い  500
AclException CakeException Aclコンポーネント関連の例外  500
CacheException CakeException キャッシュ関連の例外  500
RouterException CakeException ルーター関連の例外  500
CakeLogException CakeException ログ関連の例外  500
CakeSessionException CakeException セッション関連の例外  500
ConfigureException CakeException ConfigureReader が設定ファイルを読み取る際の例外 500
SocketException CakeException ソケット関連の例外 500
XmlException CakeException XML関連の例外 500
ConsoleException CakeException コンソール関連の例外 500
FatalErrorException CakeException 致命的なエラー 500
NotImplementedException CakeException 501エラー 501

かなり細かく定義されているように思います。これらにphpの組み込みの例外クラスを組み合わせれば様々な表現ができるのではないでしょうか。

ついでに Standard PHP Library (SPL) に用意されている例外クラスを上げると以下のとおり。
@see http://php.net/manual/ja/book.spl.php 

PHPの標準ライブラリ(SPL)で定義されている例外クラス
BadFunctionCallException 未定義の関数をコールバックが参照したり、引数を指定しなかったりした場合にスローされる例外
BadMethodCallException 未定義のメソッドをコールバックが参照したり、引数を指定しなかったりした場合にスローされる例外
DomainException 定義したデータドメインに値が従わないときにスローされる例外
InvalidArgumentException 引数が期待値に一致しなかった場合にスローされる例外
LengthException 長さが無効な場合にスローされる例外
LogicException プログラムのロジック内でのエラーを表す例外
OutOfBoundsException 値が有効なキーでなかった場合にスローされる例外
OutOfRangeException 無効なインデックスを要求した場合にスローされる例外です。 これは、コンパイル時に検出しなければなりません。
OverflowException いっぱいになっているコンテナに要素を追加した場合にスローされる例外
RangeException プログラムの実行時に範囲エラーが発生したことを示すときにスローされる例外です。 通常は、アンダーフローやオーバーフロー以外の計算エラーが発生したことを意味します。 これは、実行時版の DomainException です。
RuntimeException 実行時にだけ発生するようなエラー
UnderflowException 空のコンテナ上で無効な操作 (要素の削除など) を試みたときにスローされる例外
UnexpectedValueException いくつかの値のセットに一致しない値であった際にスローされる例外です。 これが発生する例としては、ある関数が別の関数をコールしていて、 その関数の返り値が特定の型や値である (そして計算やバッファ関連のエラーがない) ことを想定している場合があります。