Exception::getTrace
(PHP 5 >= 5.1.0, PHP 7)
Exception::getTrace — Получает трассировку стека
Описание
final public array Exception::getTrace
( void
)
Возвращает трассировку стека исключения.
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает трассировку стека исключения в виде массива (array).
Примеры
Пример #1 Пример использования Exception::getTrace()
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>
Результатом выполнения данного примера будет что-то подобное:
array(1) { [0]=> array(4) { ["file"]=> string(22) "/home/bjori/tmp/ex.php" ["line"]=> int(7) ["function"]=> string(4) "test" ["args"]=> array(0) { } } }
- Функция Exception::__construct() - Создать исключение
- Функция Exception::getMessage() - Получает сообщение исключения
- Функция Exception::getPrevious() - Возвращает предыдущее исключение
- Функция Exception::getCode() - Получает код исключения
- Функция Exception::getFile() - Получает файл, в котором возникло исключение
- Функция Exception::getLine() - Получает строку, в которой возникло исключение
- Функция Exception::getTrace() - Получает трассировку стека
- Функция Exception::getTraceAsString() - Получает трассировку стека в виде строки
- Функция Exception::__toString() - Строковое представление исключения
- Функция Exception::__clone() - Клонировать исключение
Коментарии
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();
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'.
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) {
}
}
}
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).
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