[PHP-users 35296] デストラクタ内の例外処理
goto
gotou1213 @ gmail.com
2010年 7月 15日 (木) 02:01:30 JST
いつもお世話になっております。
後藤と申します。
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 メーリングリストの案内