例外は明示的にthrowする

PHPで例外を使うときに気をつけていること。それはできるだけ明示的にthrowしてあげることだ。発生しうる例外をcatchせず、何もしなければより上位の呼び出し元にthrowされていくが、そうしてしまうとPHPの場合メソッドにJavaのようなthrows句がないので、その処理で例外が起こりうるのかどうかが非常にわかりづらい。DocCommentで@throwsが書かれていれば少しは手助けになるが、そのDocCommentがソースときちんと同期されて手直しされているかどうかは保証されていない。というわけで、例外を上位の処理にそのままthrowする場合でも、明示的にcatchしてthrowし直したりするようなコードを書く場合が多い。

<?php
class Foo
{
    /**
     * @throws BazException in the case of 原因
     */
    public function bar()
    {
        try {
            // 何か処理
        } catch (BazException $e) {
            throw $e; // そのままthrow
        }
    }
}

throws句があればこんな工夫はいらないのにね。