我正在尝试在处理来自例如的错误时保留调用堆栈。 net.js。
以下示例有效,但要求我为每次不是最佳的调用预先分配错误对象。
function socketStuff(callback) {
// ..
var maybeError = new Error 'Socket error ';
socket.on('error', function(error) {
maybeError.message += error.message;
callback(maybeError);
});
}
有没有办法将我在函数上下文中创建错误所得到的堆栈添加到我从套接字获取的错误而不必事先创建错误对象?
答案 0 :(得分:3)
您必须在new Error()
来电时预先获取堆栈跟踪。您不必创建实际的Error对象;您也可以使用the V8 stack trace API来执行此操作:
var stackHolder = {};
Error.captureStackTrace(stackHolder, nameOfCurrentFunction);
现在堆栈可用stackHolder.stack
。
V8懒惰格式化堆栈,所以这并不像你想象的那么昂贵; stack
属性实际上是一个属性getter,它在第一次运行时进行格式化工作,然后用输出替换它自己。 (来自上面链接的文档:“为了提高效率,堆栈跟踪在捕获时不会被格式化,而是在需要时,第一次访问堆栈属性。”)
答案 1 :(得分:0)
只需使用现有的长堆栈跟踪库,例如this one