2010年7月15日

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

いつもお世話になっております。
後藤と申します。

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が実行されます。

(1)のthrowを削除すると期待通りの動作になります。

また、(2)でcatchされた例外の内容を確認すると
______________________________________

exception 'Exception' with message 'bbb' 〜省略〜
Next exception 'Exception' with message 'aaa' 〜省略〜
______________________________________

の様になっており、(1)と(3)で投げた例外が(2)でまとめてcatchされたような動作に見えます。


同じコードを PHP 5.2.13 で実行すると、期待通り(4)はスルーされて(5)で例外がキャッチされました。

PHP 5.2.13の動作の方が自然・・というかPHP 5.3.2の方はバグっぽいように
感じるのですが、この動作について何か知識をお持ちの方がいらしましたら
何かご教授いただければ幸いです。
_______________________________________________
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日 02:01
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/97062
トラックバック
コメント
コメントする




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