2010年7月15日

[PHP-users 35297] Re:デストラクタ内の例外処理

komura です。

On Thu, 15 Jul 2010 02:01:30 +0900
goto <gotou1213@xxxxx> wrote:

> PHP 5.3.2で下記のコードを実行したときに
> ______________________________________
> <?php

> class aaa
> {
> public function __destruct()
> {
> try
> {
> // (1)
> throw new Exception(__CLASS__);
> }
> catch(Exception $ex)
> {
> // (2)
> echo __LINE__.": $ex\n\n";
> }
> }
> }
>
> function bbb()
> {
> $a = new aaa();
> // (3)
> throw new Exception(__FUNCTION__);
> }
>
> function ccc()
> {
> try
> {
> bbb();
> // (4)
> echo __LINE__.": XXX\n\n";
> }
> catch(Exception $ex)
> {
> // (5)
> echo __LINE__.": $ex\n\n";
> }
> }
>
> ccc();
> ______________________________________
>
>
> (3)で投げた例外を(5)でcatchすることを期待しているのですが、
> 実際には(4)のechoが実行されます。


詳しく調べたわけではないのですが、バグだと思います。
PHP 5.3.3RC2 で試してみたところ、以下のような結果になりました。

--------------------------------------------------------------------------
14: exception 'Exception' with message 'bbb' in /home/komura/ex.php:23
Stack trace:
#0 /home/komura/ex.php(30): bbb()
#1 /home/komura/ex.php(41): ccc()
#2 {main}

Next exception 'Exception' with message 'aaa' in /home/komura/ex.php:9
Stack trace:
#0 /home/komura/ex.php(30): aaa->__destruct()
#1 /home/komura/ex.php(30): bbb()
#2 /home/komura/ex.php(41): ccc()
#3 {main}

37: exception 'Exception' with message 'bbb' in /home/komura/ex.php:23
Stack trace:
#0 /home/komura/ex.php(30): bbb()
#1 /home/komura/ex.php(41): ccc()
#2 {main}
--------------------------------------------------------------------------

(4) の echo は実行されませんでした。ただ、(3) で投げた例外が、(2) と (5)
の両方で補足されているため、修正されたわけではないと思います。

PHP 5.3.2 公開後にデストラクタや例外に関連する修正がありましたので、その
影響だと思います。もし、この挙動が気になるようでしたら、バグ報告する
ことをお勧めします。

--
komura <komura.db2r1e@xxxxx>
_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2010年7月15日 21:53
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/97063
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。