Error.captureStackTrace
发布于 3 年前 作者 danielsss 3466 次浏览 最后一次编辑是 2 年前 来自 问答

麻烦谁解释下这个东西是干什么用的? 或是在那里能看到文档也可以, 找了很久也没找到这个函数的资料.

谢谢各位哥哥姐姐

7 回复

当catch到一个error. 获取error.stack时,会调用这个函数。

http://www.bennadel.com/blog/2828-creating-custom-error-objects-in-node-js-with-error-capturestacktrace.htm 这是一个自定义Error的例子

@joesonw 成功get新技能, thx

Error.captureStackTrace(targetObject[, constructorOpt]) 在targetObject中添加一个.stack属性。对该属性进行访问时,将以字符串的形式返回Error.captureStackTrace()语句被调用时的代码位置信息(即:调用栈历史)。

Error.captureStackTrace()并不是ECMAScript标准所定义的内容,而是由V8引擎提供的Stack Trace API, 因此只能在Node.js和Chome浏览器中使用。 Node.js相关文档地址:https://nodejs.org/api/errors.html#errors_error_capturestacktrace_targetobject_constructoropt V8相关文档地址:https://github.com/v8/v8/wiki/Stack-Trace-API

写过一篇介绍Error.captureStackTrace的文章,供参考:http://blog.shaochuancs.com/about-error-capturestacktrace/

@shaochuancs 感谢分享 但是看完了还是不是特别明白,Error.captureStackTrace(error)和new Error(error).stack的使用场景的区别 除了Error.captureStackTrace的第二个参数可以忽略部分栈信息之外,还有什么别的用法吗

@hyj1991 从适用性上来说,new Error().stack的适用范围会更加广泛,而Error.captureStackTrace只能在Node.js或者Chrome上使用。

在两者都能使用的情况下,优先使用Error.captureStackTrace,原因为:

  1. 无需new一个新的Error对象,节省内存空间,同时代码上也会更加优雅。
  2. 如果需要忽略部分堆栈信息,使用Error.captureStackTrace会更加方便,无需手工操作。
  3. 如果使用Error.captureStackTrace,则对于堆栈信息的格式化工作会被延迟至访问targetObj.stack时进行,如果targetObj.stack未被访问,则堆栈信息的格式化工作会被省略,从而节省计算资源。

@shaochuancs 学到了,非常感谢!

回到顶部