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

如何在Deno中清理堆栈跟踪?自定义raise函数栈行移除失败

如何在Deno中移除自定义raise函数的栈跟踪行

我自定义了一个raise函数用来抛出错误,原本想移除栈跟踪里属于raise函数本身的行,但在Deno中直接修改Error.stack的方式无效,栈行依然会被打印出来。

原代码如下:

window.raise = function (msg) {
  var e, lines;
  e = new Error(msg);
  // 尝试移除raise函数的栈行
  lines = e.stack.split("\n");
  lines.splice(1, 1);
  e.stack = lines.join("\n");
  throw e;
}
raise('test')

实际运行输出(仍包含raise函数的栈行):

> deno run ./play.js
error: Uncaught Error: test
  e = new Error(msg);
      ^
    at window.raise (file:///play.js:3:7)
    at file:///play.js:10:1

期望输出:

> deno run ./play.js
error: Uncaught Error: test
  e = new Error(msg);
      ^
    at file:///play.js:10:1

解决方法

Deno的错误栈处理逻辑和浏览器不同,直接修改stack属性无法生效,因为Deno在抛出错误时可能会重新生成完整的栈跟踪。可以使用Error.captureStackTrace来精准控制栈的生成范围,排除raise函数本身的调用记录。

修改后的代码:

window.raise = function (msg) {
  const e = new Error(msg);
  // 捕获栈跟踪时排除当前的raise函数
  Error.captureStackTrace(e, raise);
  throw e;
}
raise('test')

运行这段代码后,栈跟踪就会只保留调用raise的那一行,符合期望输出。

内容的提问来源于stack exchange,提问作者Alex Craft

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:26:11