はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

PHPで例外チェーン

f:id:secret_hamuhamu:20150816222337j:plain
オブジェクト指向プログラミングで、例外処理をする際は 例外チェーン を意識せねばなりません。
例えばこのように、catchの中でさらに例外を投げ直していて(throw)例外チェーンをしていないとどうなるか?

<?php

class ExceptionChain
{
    public function execute()
    {
        try {
            $this->method1();
            $this->method2();
            $this->method3();
        } catch(Exception $e) {
            throw new Exception('execute error.', $e->getCode());
        }
    }

以下、stack traceで ExceptionChainTest.php が実行コードです。

Time: 115 ms, Memory: 13.25Mb

There was 1 error:

1) ExceptionChainTest::テスト
Exception: execute error.

/Users/y-ohhashi/PHP/ExceptionChain/ExceptionChain.php:12
/Users/y-ohhashi/PHP/ExceptionChain/ExceptionChainTest.php:11

ExceptionChain.php:12 12行目でエラーが起きていることがわかります。
12行目 throw new Exception('execute error.', $e->getCode());

なにが問題なのか わかったと思いますが、例外メッセージの根本的な例外の原因が握りつぶされてstack traceに表示されています。
method1 なのか? method2 なのか? method3 なのか?
どこで例外が起こったのかわかりません。
デバッグが非常に困難なのがわかります。

catch の中で例外を投げ直すことは悪いことではありません。
大事なのは、新しい例外と前の例外を繋げてあげること。
つまり、例外のチェーンを行う。

Exceptionのコンストラクタの第三引数に、前の例外を渡します。
php.net Exception::__construct

throw new Exception('execute error.', $e->getCode(), $e);

これだけ。

再び実行してみる。
以下、stack trace

Time: 120 ms, Memory: 13.25Mb

There was 1 error:

1) ExceptionChainTest::テスト
Exception: execute error.

/Users/y-ohhashi/PHP/ExceptionChain/ExceptionChain.php:12
/Users/y-ohhashi/PHP/ExceptionChain/ExceptionChainTest.php:11

Caused by
Exception: method2 error.

/Users/y-ohhashi/PHP/ExceptionChain/ExceptionChain.php:21
/Users/y-ohhashi/PHP/ExceptionChain/ExceptionChain.php:9
/Users/y-ohhashi/PHP/ExceptionChain/ExceptionChainTest.php:11

例外チェーンされました。

オススメの本

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

  • 作者: 川瀬裕久,古川文生,松尾大,竹澤有貴,小山哲志,新原雅司
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/04/21
  • メディア: 大型本
  • この商品を含むブログを見る

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

Head Firstオブジェクト指向分析設計 ―頭とからだで覚えるオブジェクト指向の基本

Head Firstオブジェクト指向分析設計 ―頭とからだで覚えるオブジェクト指向の基本

  • 作者: Brett McLaughlin,Gary Pollice,長瀬嘉秀,永田渉,株式会社テクノロジックアート
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2007/12/04
  • メディア: 単行本
  • 購入: 4人 クリック: 77回
  • この商品を含むブログ (26件) を見る

アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技

アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技

  • 作者: ロバート・C・マーチン,瀬谷啓介
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 2008/07/01
  • メディア: 大型本
  • 購入: 18人 クリック: 586回
  • この商品を含むブログ (71件) を見る

オラクル認定資格教科書 Javaプログラマ Bronze SE 7/8

オラクル認定資格教科書 Javaプログラマ Bronze SE 7/8