Hacklang如何从Exception对象中获取堆栈跟踪信息?
从Exception对象获取堆栈跟踪信息的正确方式
你刚才的代码报错,核心问题是错误地把getTrace()当成静态方法调用了——Exception类的getTrace()是实例方法,得用箭头->调用,而不是双冒号::的静态调用语法。
修正后的代码示例
下面是正确获取调用栈和行号的代码,两种方式供你选:
function do_it(int $x, int $y): void { try { $result = $x / $y; } catch (\Exception $ex) { echo "Caught an Exception\n"; // 方式1:获取原始数组格式的调用栈,自行处理输出 $trace = $ex->getTrace(); echo "\nRaw stack trace array:\n"; foreach ($trace as $idx => $call) { $file = $call['file'] ?? 'unknown file'; $line = $call['line'] ?? 'unknown line'; $func = $call['function'] ?? 'unknown function'; echo "#{$idx} {$file}:{$line} - {$func}\n"; } // 方式2:直接获取格式化好的字符串,省心高效 echo "\nFormatted stack trace:\n"; echo $ex->getTraceAsString(); } } <<__EntryPoint>> function main(): void { do_it(100, 0); }
关键说明
getTrace():返回一个关联数组,每个元素对应调用栈的一层,包含file(触发代码的文件名)、line(行号)、function(调用的函数名)等字段,适合你需要自定义处理这些信息的场景。getTraceAsString():直接返回已经格式化好的字符串,格式和你看到的Fatal Error里的堆栈跟踪完全一致,适合快速输出或记录日志。
原来的$ex::getTrace()之所以报错,是因为Hack/PHP不允许用静态调用的方式调用非静态方法,所以才抛出了BadMethodCallException。
内容的提问来源于stack exchange,提问作者nz_21
相关产品推荐
相关产品推荐

