关于此函数有两个重要的点没有记录在案
1) 跟踪不包含抛出异常的文件/行;该条目仅记录在顶级 getFile/Line 方法中。
2) 元素以“最接近优先”的顺序返回,例如,如果您有一个脚本 x 调用函数 y,函数 y 调用函数 z,函数 z 抛出异常,则第一个跟踪元素将是“Y”,第二个将是“X”。
(PHP 5, PHP 7, PHP 8)
Exception::getTrace — 获取堆栈跟踪
此函数没有参数。
将异常堆栈跟踪作为 数组 返回。
示例 #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) { } } }
关于此函数有两个重要的点没有记录在案
1) 跟踪不包含抛出异常的文件/行;该条目仅记录在顶级 getFile/Line 方法中。
2) 元素以“最接近优先”的顺序返回,例如,如果您有一个脚本 x 调用函数 y,函数 y 调用函数 z,函数 z 抛出异常,则第一个跟踪元素将是“Y”,第二个将是“X”。
如果您想在 PHP 7.4 上查看堆栈跟踪中的参数,请注意 php.ini 文件中现在有一个 zend 标志,默认设置为关闭。
zend.exception_ignore_args = Off
将此标志设置为打开,它将再次显示参数。
zend.exception_ignore_args = On
https://php.net/manual/en/ini.core.php#ini.zend.exception-ignore-args
调用 getTrace() 时,返回的数组中也会有类的名称
<?php
class Test {
function __construct() {
throw new Exception('FATAL ERROR: bla bla...');
}
}
try {
$obj = new Test();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>
将显示类似以下内容
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) { }
}
}
您可以使用此函数格式化异常
<?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);
}
?>
结果
Exception: "FATAL ERROR: bla bla..." @ Test->__construct();
跟踪的顺序从异常的源头开始,不包括 main。
例如
<?php
function Bar() {
throw new Exception;
}
function Foo() {
Bar();
}
try {
Foo();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>
将输出
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) {
}
}
}
从 PHP 7.4 开始,Exception::getTrace()(和 Error::getTrace())的返回值不再包含像 debug_backtrace() 那样带有默认选项的“args”键。
因此,从 7.4 开始的返回值类似于 debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)。