PHPerKaigi 2024

Exception::getTrace

(PHP 5, PHP 7, PHP 8)

Exception::getTraceGets the stack trace

Description

final public Exception::getTrace(): array

Returns the Exception stack trace.

Parameters

This function has no parameters.

Return Values

Returns the Exception stack trace as an array.

Examples

Example #1 Exception::getTrace() example

<?php
function test() {
throw new
Exception;
}

try {
test();
} catch(
Exception $e) {
var_dump($e->getTrace());
}
?>

The above example will output something similar to:

array(1) {
  [0]=>
  array(4) {
    ["file"]=>
    string(22) "/home/bjori/tmp/ex.php"
    ["line"]=>
    int(7)
    ["function"]=>
    string(4) "test"
    ["args"]=>
    array(0) {
    }
  }
}

See Also

add a note

User Contributed Notes 5 notes

up
34
sam at notmyrealemail dot org
12 years ago
Two important points about this function which are not documented:

1) The trace does not include the file / line at which the exception is thrown; that entry is only recorded in the top-level getFile/Line methods.

2) Elements are returned in 'closest-first' order, e.g. if you have a script x which calls function y which calls function z which throws an exception, then the first trace element will be 'Y' and the second will be 'X'.
up
17
ronald at ronalddiaz dot net
3 years ago
If you are wanting to see the args within a stack trace on PHP 7.4, note that there is now a zend flag in the php.ini file that is default set to Off.

zend.exception_ignore_args = Off

Set this flag to On and it will show the args again.

zend.exception_ignore_args = On

https://www.php.net/manual/en/ini.core.php#ini.zend.exception-ignore-args
up
4
andreas at cap-systems dot com
13 years ago
When calling getTrace(), there is also the name of the class in returned array:

<?php
class Test {

function
__construct() {

throw new
Exception('FATAL ERROR: bla bla...');

}

}

try {

$obj = new Test();

} catch(
Exception $e) {

var_dump($e->getTrace());

}
?>

Will show something like:

array(1) {
[0]=> array(6) {
["file"]=> string(54) "/....../test.php"
["line"]=> int(37)
["function"]=> string(11) "__construct"
["class"]=> string(4) "Test"
["type"]=> string(2) "->"
["args"]=> array(0) { }
}
}

You can use this function to format a exception:

<?php
function MakePrettyException(Exception $e) {
$trace = $e->getTrace();

$result = 'Exception: "';
$result .= $e->getMessage();
$result .= '" @ ';
if(
$trace[0]['class'] != '') {
$result .= $trace[0]['class'];
$result .= '->';
}
$result .= $trace[0]['function'];
$result .= '();<br />';

return
$result;
}

//Example:
try {

$obj = new Test();

} catch(
Exception $e) {

echo
MakePrettyException($e);

}

?>

Result:

Exception: "FATAL ERROR: bla bla..." @ Test->__construct();
up
1
knivey
10 years ago
The order of the trace starts at the source of the exception and does not include main.
So for example:

<?php
function Bar() {
throw new
Exception;
}

function
Foo() {
Bar();
}

try {
Foo();
} catch(
Exception $e) {
var_dump($e->getTrace());
}
?>

Will output:

array(2) {
[0]=>
array(4) {
["file"]=>
string(21) "/.../test.php"
["line"]=>
int(8)
["function"]=>
string(3) "Bar"
["args"]=>
array(0) {
}
}
[1]=>
array(4) {
["file"]=>
string(21) "/.../test.php"
["line"]=>
int(12)
["function"]=>
string(3) "Foo"
["args"]=>
array(0) {
}
}
}
up
0
an43 dot bal at gmail dot com
3 years ago
As of PHP 7.4 return values of Exception::getTrace() (and Error::getTrace()) no longer contains "args" keys like debug_backtrace() with default options.

So, return value since 7.4 is like debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS).
To Top