[Zend Framework] Zend_Exception: エラー処理を用意する、エラーコントローラにスローする

ErrorController を確認しながら、例外処理まわりについて調べていきます。
Zend Framework Version: 1.12.3

[markdown]

## PHP

混乱してます。PHPの書籍を読まないと分からないかな。

> PHP5よりtry&catchによる例外処理(Exception)を使うことができるようになりました。
>
> エラーが出たとき、PHPではそこで処理が停止していましたが、例外処理を導入することで エラーが起きても処理を続けることができるようになり、また開発者にとっては、『どこで』『どんな』エラーが出たのかがわかりやすくなります。
>
> 例外処理によるエラー処理とは、プログラムの実装によるバグを受け取るものではなく、処理を続行できない想定される問題に対処するためのものです。
> * [例外処理(Exception) – [PHP + PHP] ぺんたん info](http://pentan.info/php/exception.html)

「ただしPHPの内部関数の多くは例外処理に対応していないので、 使用できるのは例外処理を実装した新しいオブジェクト指向の拡張モジュールのみになります。」と最後に書いてあります。

> * [PHPのオブジェクト指向入門 | オブジェクト指向PHP.NET](http://www.objective-php.net/basic/exception)

「明示的にthrowしない限りはtry~catchの意味はありません。」とのこと。

## Zend_Exception

オブジェクト指向で開発されているので、エラーは全て例外をスローするとのこと。

> * [Zend_Exception – Zend Framework Reference – Zend Framework](http://framework.zend.com/manual/1.12/ja/zend.exception.html)

ErrorController でエラーが処理されます。

### try – catch

try – catch を仕掛けることで、エラー処理をプログラマが明示的に用意できます。

“`php
try {
// Zend_Loader::loadClass() で、存在しないクラスを指定してコールすると
// Zend_Loader で例外がスローされます
Zend_Loader::loadClass(‘nonexistantclass’);
} catch (Zend_Exception $e) {
echo “キャッチした例外: ” . get_class($e) . “
“;
echo “メッセージ: ” . $e->getMessage() . “
“;
// その他、エラーから復帰するためのコード
// throw new Zend_Exception($e->getMessages);
}
“`

下記を使って try – catch なしでエラーを発生させると、ErrorController で処理されることが分かります。

“`php
Zend_Loader::loadClass(‘nonexistantclass’);
“`

### throw new Zend_Exception()

上記のように catch 内だったり、if 文の途中だったりで ErrorController に処理を任せたくなった場合には、throw new Zend_Exception() をすることで、例外をスローできます。

“`php
throw new Zend_Exception(‘エラーが発生しました’);
“`

### 404 を発生させたい場合

“`php
$this->getResponse()->setHttpResponseCode(404);
“`

“`php
throw new Zend_Controller_Action_Exception(‘This page does not exist’, 404);
“`

> * [php – How to throw 404 exceptions in Zend Framework – Stack Overflow](http://stackoverflow.com/questions/3815808/how-to-throw-404-exceptions-in-zend-framework)

[/markdown]