You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:32:59