在JavaScript
中主要通过Error
对象提供错误堆栈信息,当程序出现错误是经常可以看到堆栈错误信息的输出,本文主要简单介绍如何对错误堆栈进行捕获和格式化输出。
概述
对于JavaScripts
的Error
对象,我们经常可以看到如下错误信息:
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
提供了定制Error
中Stack
的方法
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: 获取列数
🚗