Req #45351 [Com]: Exception::getTrace() should return 'object' array-element

From: Date: Mon, 24 Nov 2014 09:43:41 +0000
Subject: Req #45351 [Com]: Exception::getTrace() should return 'object' array-element
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-188773@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=45351&edit=1

 ID:                 45351
 Comment by:         roborg at hotmail dot com
 Reported by:        lasse100 at planet dot nl
 Summary:            Exception::getTrace() should return 'object'
                     array-element
 Status:             Open
 Type:               Feature/Change Request
 Package:            Scripting Engine problem
 Operating System:   *
 PHP Version:        5.3
 Block user comment: N
 Private report:     N

 New Comment:

As a (hopefully) simple improvement to the current situation, would it be possible to have the class
name of the object passed though?

At the moment, the "class" is the class the function is defined in, which makes sense, but
if it's a base class then there's no way to find out which derived class the exception was
really thrown in.

Example:
--------

<?php

class A
{
	public function foo()
	{
		throw new Exception();
	}
}

class B extends A
{
}

$b = new B();

try
{
	$b->foo();
}
catch (Exception $e)
{
	var_dump($e->getTrace());
}


Expected result:
----------------

There should be a mention of "B" in the trace somewhere - in a new property
"object_class" maybe?

Actual Result:
--------------

array(1) {
  [0]=>
  array(6) {
    ["file"]=>
    string(58) "c:\test.php"
    ["line"]=>
    int(19)
    ["function"]=>
    string(3) "foo"
    ["class"]=>
    string(1) "A"
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
}


Previous Comments:
------------------------------------------------------------------------
[2013-01-06 04:17:49] stas@php.net

Unfortunately, proposed solution breaks the fix for bug #29368, since it keeps the 
reference to the constructed option. Better solution is needed (maybe better patch 
for #29368).

------------------------------------------------------------------------
[2013-01-04 19:38:24] lstrojny@php.net

A test is missing for the new functionality.

------------------------------------------------------------------------
[2012-08-16 07:38:05] jachym dot tousek at gmail dot com

Why is this feature not yet integrated in PHP?

------------------------------------------------------------------------
[2008-06-24 20:23:26] lasse100 at planet dot nl

Description:
------------
As in function debug_backtrace(), the method Exception::getTrace() should return a array with a
'object' element, representing the current object.

The method Exception::getTrace() should also have a $provide_object parameter like the parameter in
function debug_backtrace(), to disable the 'object'-element in the array.

Reproduce code:
---------------
<?php
class Foo {
    public $bar;
    public function __construct($bar) {
        $this->bar = $bar;
        echo 'debug_backtrace: <pre>';
        var_dump(debug_backtrace());
        echo '</pre>';
        throw new Exception('Foo throws an exception!');
    }
}
try {
    $foo = new Foo('test');
} catch (Exception $e) {
    echo 'Exception::getTrace(): <pre>';
    var_dump($e->getTrace());
    echo '</pre>';
}
?>

Expected result:
----------------
debug_backtrace:

array(1) {
  [0]=>
  array(7) {
    ["file"]=>
    string(50) "C:\server\apache\htdocs\forum\htdocs\bugreport.php"
    ["line"]=>
    int(13)
    ["function"]=>
    string(11) "__construct"
    ["class"]=>
    string(3) "Foo"
    ["object"]=>
    object(Foo)#1 (1) {
      ["bar"]=>
      string(4) "test"
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(1) {
      [0]=>
      &string(4) "test"
    }
  }
}

Exception::getTrace():

array(1) {
  [0]=>
  array(6) {
    ["file"]=>
    string(50) "C:\server\apache\htdocs\forum\htdocs\bugreport.php"
    ["line"]=>
    int(13)
    ["function"]=>
    string(11) "__construct"
    ["class"]=>
    string(3) "Foo"
    ["object"]=>
    object(Foo)#1 (1) {
      ["bar"]=>
      string(4) "test"
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(1) {
      [0]=>
      string(4) "test"
    }
  }
}

Actual result:
--------------
debug_backtrace:

array(1) {
  [0]=>
  array(7) {
    ["file"]=>
    string(50) "C:\server\apache\htdocs\forum\htdocs\bugreport.php"
    ["line"]=>
    int(13)
    ["function"]=>
    string(11) "__construct"
    ["class"]=>
    string(3) "Foo"
    ["object"]=>
    object(Foo)#1 (1) {
      ["bar"]=>
      string(4) "test"
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(1) {
      [0]=>
      &string(4) "test"
    }
  }
}

Exception::getTrace():

array(1) {
  [0]=>
  array(6) {
    ["file"]=>
    string(50) "C:\server\apache\htdocs\forum\htdocs\bugreport.php"
    ["line"]=>
    int(13)
    ["function"]=>
    string(11) "__construct"
    ["class"]=>
    string(3) "Foo"
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(1) {
      [0]=>
      string(4) "test"
    }
  }
}


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=45351&edit=1


Thread (7 messages)

« previous php.bugs (#188773) next »