NodeJS解析Error中stack堆栈信息

JavaScript中主要通过Error对象提供错误堆栈信息,当程序出现错误是经常可以看到堆栈错误信息的输出,本文主要简单介绍如何对错误堆栈进行捕获和格式化输出。

概述

对于JavaScriptsError对象,我们经常可以看到如下错误信息:

ReferenceError: FAIL is not defined
       at Constraint.execute (deltablue.js:525:2)
       at Constraint.recalculate (deltablue.js:424:21)
       at Planner.addPropagate (deltablue.js:701:6)
       at Constraint.satisfy (deltablue.js:184:15)
       at Planner.incrementalAdd (deltablue.js:591:21)
       at Constraint.addConstraint (deltablue.js:162:10)
       at Constraint.BinaryConstraint (deltablue.js:346:7)
       at Constraint.EqualityConstraint (deltablue.js:515:38)
       at chainTest (deltablue.js:807:6)
       at deltaBlue (deltablue.js:879:2)

对于以上的错误信息,我们可能需要进行提取加工处理,比如提取后用于日志的记录等。
那么,如果能够提取出其中我们需要的信息呢?

正则提取

最容易想到的方法就是通过正则表达式的方法进行提取,此方法这里不再过多讲述,下面来讲下v8暴露出来的方法。

Error.prepareStackTrace
说明

Node主要是基于v8实现,而v8提供了定制ErrorStack的方法

Error.prepareStackTrace(error, structuredStackTrace)
  • error:对象本身
  • structuredStackTrace:调用栈信息数组
  • Error默认情况下返回的stack信息字符串,我们可以通过该函数进行定制化处、格式化处理
  • 该方法会修改全局Error行为
代码示例
function formatStack() {
    // 默认堆栈
    const origPrepareStackTrace = Error.prepareStackTrace;
    Error.prepareStackTrace = (_, callSites) => {
    return callSites
    	.map(item => {
    		return {
                        functionName: item.getFunctionName(),
    			fileName: item.getFileName(),
    			lineNumber: item.getLineNumber(),
    			columnNumber: item.getColumnNumber()
    		};
    	});
    };
    let {stack} = new Error();
    // 恢复默认堆栈
    Error.prepareStackTrace = origPrepareStackTrace;
    return stack;
}
备注

以上代码将Stack堆栈信息以自定义数组格式进行输出,其中callSites是一个对象,其中包括一下函数:

  • getTypeName: 获取类型
  • getFunction: 获取当前函数
  • getFunctionName: 获取当前函数名
  • getMethodName: 获取方法名
  • getFileName: 获取文件名
  • getLineNumber: 获取行数
  • getColumnNumber: 获取列数

更多参考文档:https://v8.dev/docs/stack-trace-api

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值