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

komura komura.db2r1e @ gmail.com
2010年 7月 15日 (木) 21:53:36 JST


komura です。

On Thu, 15 Jul 2010 02:01:30 +0900
goto <gotou1213 @ gmail.com> 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 @ gmail.com>


PHP-users メーリングリストの案内