PHP :: Bug #50383 :: Exceptions thrown in __call
| Bug #50383 | Exceptions thrown in __call / __callStatic do not include file and line in trace | ||||
|---|---|---|---|---|---|
| Submitted: | 2009-12-04 11:32 UTC | Modified: | 2010-03-07 03:17 UTC | ||
| From: | RQuadling at GMail dot com | Assigned: | felipe (profile) | ||
| Status: | Closed | Package: | Scripting Engine problem | ||
| PHP Version: | 5.*, 6 | OS: | * | ||
| Private report: | No | CVE-ID: | None | ||
[2009-12-04 11:32 UTC] RQuadling at GMail dot com
Description:
------------
An exception thrown in a __callStatic() method does not store the file name or the line number in the trace.
Reproduce code:
---------------
<?php
class myClass {
public static function __callStatic($method, $args) {
throw new Exception("Missing static method '$method'.");
}
}
function thrower() {
myClass::ThrowException();
}
try {
thrower();
} catch(Exception $e) {
print_r($e->getTrace());
}
Expected result:
----------------
Array
(
[0] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 4
[function] => __callStatic
[class] => myClass
[type] => ::
[args] => Array
(
[0] => ThrowException
[1] => Array
(
)
)
)
[1] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 9
[function] => ThrowException
[class] => myClass
[type] => ::
[args] => Array
(
)
)
[2] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 13
[function] => thrower
[args] => Array
(
)
)
)
Actual result:
--------------
Array
(
[0] => Array
(
[function] => __callStatic
[class] => myClass
[type] => ::
[args] => Array
(
[0] => ThrowException
[1] => Array
(
)
)
)
[1] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 9
[function] => ThrowException
[class] => myClass
[type] => ::
[args] => Array
(
)
)
[2] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 13
[function] => thrower
[args] => Array
(
)
)
)
Patches
Pull Requests
History
AllCommentsChangesGit/SVN commits
[2009-12-04 12:15 UTC] rquadling@php.net
It seems that __call exhibits the same issue. Further, for sub-classes which allow cascading of __call/__callStatic, the stack doesn't show the file/line for those. <?php // myClass.php class myClass { public static function __callStatic($method, $args) { throw new Exception("Missing static method '$method'."); } } ?> <?php // mySubClass.php require_once 'myClass.php'; class mySubClass extends myClass { public static function __callStatic($method, $args) { parent::__callStatic($method, $args); } } ?> <?php // missingTrace.php require 'mySubClass.php'; function staticThrower() { mySubClass::StaticThrowException(); } try { staticThrower(); } catch(Exception $e) { print_r($e); } ?> Outputs ... Exception Object ( [message:protected] => Missing static method 'StaticThrowException'. [string:Exception:private] => [code:protected] => 0 [file:protected] => Z:\myClass.php [line:protected] => 4 [trace:Exception:private] => Array ( [0] => Array ( [file] => Z:\mySubClass.php [line] => 6 [function] => __callStatic [class] => myClass [type] => :: [args] => Array ( [0] => StaticThrowException [1] => Array ( ) ) ) [1] => Array ( [function] => __callStatic [class] => mySubClass [type] => :: [args] => Array ( [0] => StaticThrowException [1] => Array ( ) ) ) [2] => Array ( [file] => Z:\missingstatictrace3.php [line] => 5 [function] => StaticThrowException [class] => mySubClass [type] => :: [args] => Array ( ) ) [3] => Array ( [file] => Z:\missingstatictrace3.php [line] => 9 [function] => staticThrower [args] => Array ( ) ) ) [previous:Exception:private] => )[2009-12-04 12:47 UTC] jani@php.net
Simple test that works in all branches: <?php class myClass { function __call($method, $args) { throw new Exception("Missing static method '$method'."); } } function thrower() { $foo = new myClass; $foo->ThrowException(); } try { thrower(); } catch(Exception $e) { var_dump($e->getTrace()); } ?>[2010-03-07 03:17 UTC] felipe@php.net
-Status: Verified +Status: Closed
[2010-03-07 03:17 UTC] felipe@php.net
[2010-03-08 11:06 UTC] rquadling@php.net