У меня есть функция, называемая 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);
})
})
Проблема в том, что когда я регистрирую ошибку, трассировка стека показывает только внутреннюю функцию, но не файл вызывающего. Если бы я дважды использовал эту функцию в своем коде и возникла ошибка, тогда мне нужно было знать, какая часть моего кода вызвала ее.
Как добавить информацию о вызывающем абоненте в трассировку стека ошибок?
Поскольку документ Error.prototype.stack
его как нестандартную функцию, разные платформы могут иметь разные 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()
и вызывающие.
Кстати, абзац в документе получил мое отношение:
Важно отметить, что фреймы генерируются только для функций JavaScript. Если, например, выполнение синхронно проходит через функцию C++ аддона, называемую
cheetahify
, которая сама вызывает функцию JavaScript, кадр, представляющий вызовcheetahify
, не будет присутствовать в трассировке стека
Это может быть причиной того, что мы получаем противоречивые результаты.
В любом случае, я боюсь, вам все равно придется вручную регистрировать имя файла, что зависит от того, как вы импортируете и выполняете их в первую очередь.