Exception::getTraceAsString

(PHP 5, PHP 7, PHP 8)

Exception::getTraceAsString获取堆栈跟踪作为字符串

描述

final public Exception::getTraceAsString(): string

返回异常堆栈跟踪作为字符串。

参数

此函数没有参数。

返回值

返回异常堆栈跟踪作为字符串。

示例

示例 #1 Exception::getTraceAsString() 示例

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

try {
test();
} catch(
Exception $e) {
echo
$e->getTraceAsString();
}
?>

上面的示例将输出类似于以下内容

#0 /home/bjori/tmp/ex.php(7): test()
#1 {main}

参见

添加笔记

用户贡献的笔记 2 个笔记

57
ernest at vogelsinger dot at
10 年前
老实说,Exception::getTraceAsString() 简直烂透了,只列出了调用的方法(例如,在下面的代码中,第 89 行调用了 fail2() 函数,但没有关于 fail1() 作为发起者的任何信息)。事实上,在下面的示例中,异常在第 78 行被抛出,而这完全没有包含在跟踪中,只有在异常中才能获得。链式异常也不支持。

示例
#0 /var/htdocs/websites/sbdevel/public/index.php(70): seabird\test\C->exc()
#1 /var/htdocs/websites/sbdevel/public/index.php(85): seabird\test\C->doexc()
#2 /var/htdocs/websites/sbdevel/public/index.php(89): seabird\test\fail2()
#3 /var/htdocs/websites/sbdevel/public/index.php(93): seabird\test\fail1()
#4 {main}

jTraceEx() 提供了更好的类似 Java 的堆栈跟踪,包括对链式异常的支持
异常:从类 C 抛出
at seabird.test.C.exc(index.php:78)
at seabird.test.C.doexc(index.php:70)
at seabird.test.fail2(index.php:85)
at seabird.test.fail1(index.php:89)
at (main)(index.php:93)
Caused by: 异常:从类 B 抛出
at seabird.test.B.exc(index.php:64)
at seabird.test.C.exc(index.php:75)
... 4 more
Caused by: 异常:从类 A 抛出
at seabird.test.A.exc(index.php:46)
at seabird.test.B.exc(index.php:61)
... 5 more

(见结尾处的示例代码)

<?php
/**
* jTraceEx() - 提供 Java 风格的异常堆栈跟踪
* @param $exception
* @param $seen - 传递给递归调用的数组,用于累积已看到的跟踪行
* 调用此函数时留空
* @return 字符串数组,每个跟踪行一个条目
*/
function jTraceEx($e, $seen=null) {
$starter = $seen ? 'Caused by: ' : '';
$result = array();
if (!
$seen) $seen = array();
$trace = $e->getTrace();
$prev = $e->getPrevious();
$result[] = sprintf('%s%s: %s', $starter, get_class($e), $e->getMessage());
$file = $e->getFile();
$line = $e->getLine();
while (
true) {
$current = "$file:$line";
if (
is_array($seen) && in_array($current, $seen)) {
$result[] = sprintf(' ... %d more', count($trace)+1);
break;
}
$result[] = sprintf(' at %s%s%s(%s%s%s)',
count($trace) && array_key_exists('class', $trace[0]) ? str_replace('\\', '.', $trace[0]['class']) : '',
count($trace) && array_key_exists('class', $trace[0]) && array_key_exists('function', $trace[0]) ? '.' : '',
count($trace) && array_key_exists('function', $trace[0]) ? str_replace('\\', '.', $trace[0]['function']) : '(main)',
$line === null ? $file : basename($file),
$line === null ? '' : ':',
$line === null ? '' : $line);
if (
is_array($seen))
$seen[] = "$file:$line";
if (!
count($trace))
break;
$file = array_key_exists('file', $trace[0]) ? $trace[0]['file'] : 'Unknown Source';
$line = array_key_exists('file', $trace[0]) && array_key_exists('line', $trace[0]) && $trace[0]['line'] ? $trace[0]['line'] : null;
array_shift($trace);
}
$result = join("\n", $result);
if (
$prev)
$result .= "\n" . jTraceEx($prev, $seen);

return
$result;
}
?>

以下示例代码:
<?php
class A {
public function
exc() {
throw new
\Exception('Thrown from class A'); // <-- line 46
}
}

class
B {
public function
exc() {
try {
$a = new A;
$a->exc(); // <-- line 61
}
catch(
\Exception $e1) {
throw new
\Exception('Thrown from class B', 0, $e1); // <-- line 64
}
}
}
class
C {
public function
doexc() {
$this->exc(); // <-- line 70
}
public function
exc() {
try {
$b = new B;
$b->exc(); // <-- line 75
}
catch(
\Exception $e1) {
throw new
\Exception('Thrown from class C', 0, $e1); // <-- line 78
}
}
}

function
fail2() {
$c = new C;
$c->doexc(); // <-- line 85
}

function
fail1() {
fail2(); // <-- line 89
}

try {
fail1(); // <-- line 93
}
catch(
\Exception $e) {
echo
jTraceEx($e);
}
?>
6
cottton at i-stats dot net
9 years ago
该方法使用 \n 来表示换行符(我原本期待的是 PHP_EOL,不过...)。
如果你想将字符串记录为单行,可以使用类似下面的代码:
<?php
$separator
= ', ';
$one_line = str_replace("\n", $separator, $e->getTraceAsString());
?>
To Top