• 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    正则提取

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

    Error.prepareStackTrace
    说明

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

    Error.prepareStackTrace(error, structuredStackTrace)
    
    • 1
    • 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    备注

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

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

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

  • 相关阅读:
    【Excel】 给证件照换底色
    二叉树题目:层数最深叶子结点的和
    总结进程和线程的区别【重点】
    大数据ClickHouse(十):MergeTree系列表引擎之SummingMergeTree
    牛!playwright 一行命令一键把html网页保存为pdf,太方便了!
    算力,承载AI无限可能
    [附源码]java毕业设计鲜花销售管理系统
    Redis八股
    Flask框架——基于类的视图
    【python项目推荐】键盘监控--统计打字频率
  • 原文地址:https://blog.csdn.net/John_rush/article/details/133894533