如何在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
相关产品推荐
相关产品推荐

