我有一个名为inner的函数执行一系列asinc操作:
function inner(input) {
return step1(input)
.then(step2)
.then(step3)
.catch((e) => {
throw e
})
}
我从内部重新抛出错误,因此我可以处理调用者级别的错误。
这是一个简单的例子:
app.get('/', function(req, res){
inner(req)
.then(result => {
res.render('foo', result)
}).catch((e) => {
res.render('error', e);
//eventually this would be changed to logger.error(e)
console.log(e);
})
})
问题在于,当我记录错误时,堆栈跟踪仅显示内部函数,但不显示调用者文件。如果我想在我的代码中使用此函数两次并发生错误,那么我需要知道我的代码的哪一部分称为它。
如何将调用者信息添加到错误堆栈跟踪?
答案 0 :(得分:0)
由于Error.prototype.stack
文档将其标记为非标准功能,因此不同的平台可能具有不同的行为和格式。
例如,我在Chrome中使用以下文件对其进行了测试:
<强>的index.html 强>
<!doctype html>
<html>
<head>
<script src="inner.js"></script>
<script src="caller1.js"></script>
<script src="caller2.js"></script>
</head>
<body></body>
</html>
<强> inner.js 强>
function inner() {
return new Promise((resolve, reject) => {
reject(new Error('Oh no'))
}).catch(e => { throw e })
}
caller1.js 和 caller2.js
inner().catch(e => { console.log(e.stack) })
结果在控制台:
Error: Oh no
at Promise (setup.js:3)
at Promise (<anonymous>)
at inner (setup.js:2)
at caller1.js:1
Error: Oh no
at Promise (setup.js:3)
at Promise (<anonymous>)
at inner (setup.js:2)
at caller2.js:1
inner()
和调用者都显示在堆栈跟踪中。
在您的情况下,您可以手动将其记录在来电者的catch()
。
如果代码在浏览器中执行,请使用document.currentScript
及其src
属性来获取文件名。
我在Node.js v8.1.2中测试了它,同时也显示了inner()
和调用者。
顺便说一下,document中的一段开头了:
请务必注意,帧仅为JavaScript生成 功能。例如,如果执行同步通过a 名为
cheetahify
的C ++插件函数,它本身调用JavaScript 函数,代表cheetahify
调用的帧不会 存在于堆栈跟踪中
这可能是我们得到不一致结果的原因。
无论如何,我担心你仍然需要手动记录文件名,这取决于你如何导入和执行它们。