2024年PHP开发者大会日本站

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)
由以下原因引起:异常:从类 B 抛出
at seabird.test.B.exc(index.php:64)
at seabird.test.C.exc(index.php:75)
... 4 more
由以下原因引起:异常:从类 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'); // <-- 第46行
}
}

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

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

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

try {
fail1(); // <-- 第93行
}
catch(
\Exception $e) {
echo
jTraceEx($e);
}
?>
6
cottton at i-stats dot net
9年前
此方法使用 \n 表示换行符(我期望的是 PHP_EOL,但是……)。
如果要将字符串记录为单行,请使用类似以下内容:
<?php
$separator
= ', ';
$one_line = str_replace("\n", $separator, $e->getTraceAsString());
?>
To Top