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


本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

只有地板了

  1. 一切随风
    一切随风

    🚗

添加新评论