110 votes

Comment déterminer le numéro de ligne actuel en JavaScript ?

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) ?

2voto

scunliffe Points 30964

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é)

1voto

Pawel Points 204
const line = new Error().stack.match(/(:[\d]+)/)[0].replace(':','')
console.log(line)

1voto

bmacnaughton Points 2507

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.

0voto

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'))
*/

-1voto

Viree Points 21

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X