[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 メーリングリストの案内