JavaScript dispose-t-il d'un mécanisme permettant de déterminer le numéro de ligne de l'instruction en cours d'exécution (et si oui, quel est-il) ?
Réponses
Trop de publicités?Vous pouvez essayer :
window.onerror = handleError;
function handleError(err, url, line){
alert(err + '\n on page: ' + url + '\n on line: ' + line);
}
Lancez ensuite une erreur là où vous voulez savoir (ce n'est pas très souhaitable, mais cela peut vous aider si vous déboguez).
Remarque : window.onerror
n'est pas défini/géré dans WebKit o Opéra (la dernière fois que j'ai vérifié)
Si vous utilisez node.js et que vous vous souciez du coût de l'obtention du numéro de ligne (ce qui n'est probablement pas la chose la plus importante), l'utilisation des callsites de la v8 est la meilleure façon que je connaisse d'obtenir le numéro de ligne.
Le code suivant évite le coût de la conversion de la pile en texte et extrait les appelants ( stack[1]
) directement à partir de la ligne callsites
objet.
'use strict';
function thisLine() {
let line;
const _prepareStackTrace = Error.prepareStackTrace;
Error.prepareStackTrace = (_, stack) => {
line = stack[1].getLineNumber();
};
const e = new Error();
e.stack;
Error.prepareStackTrace = _prepareStackTrace;
return line;
}
if (require.main === module) {
console.log('this line is', thisLine());
}
voir https://v8.dev/docs/stack-trace-api pour la documentation.
Source : git @tiagofrancafernandes
var getPos = (toGet = null) => {
let stack = String(new Error().stack);
let calledFrom = String((stack.split(`\n`)).filter(item => item).at(-1));
calledFrom = calledFrom.startsWith('@') ? calledFrom.slice(1) : calledFrom;
let items = {
stack: stack,
calledFrom: calledFrom,
}
let lineCol = String(calledFrom).match(/(\:)([0-9]){1,}(:([0-9]).?)$/g)[0];
lineCol = String(lineCol).split(':').filter(item => item)
items['lineCol'] = lineCol.join(':');
items['line'] = lineCol.length == 2 ? lineCol[0] : null;
items['col'] = lineCol.length == 2 ? lineCol[1] : null;
toGet = toGet ? String(toGet) : null;
if (toGet && !Object.keys(items).includes(toGet)) {
return null;
}
return items[`${toGet}`] ?? items;
}
var __LINE__ = () => getPos('line');
// Usage
/*
console.log(getPos())
console.log(__LINE__())
console.log(getPos('lineCol'))
console.log(getPos('line'))
console.log(getPos('col'))
console.log(getPos('calledFrom'))
console.log(getPos('stack'))
*/
Purement, on ne peut pas obtenir le numéro de ligne à partir de Error.stack, parce que dans Angular le numéro de ligne est le numéro de ligne du code compilé. Mais on peut obtenir l'information sur la méthode dans laquelle l'erreur a été créée. La classe Logger de cet extrait de code ajoute cette information à une nouvelle entrée du journal de bord.
https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts
0 votes
Duplicata possible de Comment obtenir le numéro de ligne de la fonction de l'appelant JavaScript ? Comment obtenir l'URL source de l'appelant JavaScript ?