Start · Sprachen · JavaScript · Referenz · Error: lineNumber

Error: lineNumber

Eigenschaft

Nicht standardisierte Eigenschaft einer <code>Error</code>-Instanz, die die Zeilennummer in der Quelldatei enthält, in der der Fehler erzeugt wurde.

seit JavaScript Nicht standardisiert – nur Firefox (SpiderMonkey) Kategorie: method-property

Signatur

Error.prototype.lineNumber

Beschreibung

Die Daten-Eigenschaft lineNumber einer Error-Instanz enthält die Zeilennummer der Datei, in der der Fehler erzeugt wurde. Die Zählung beginnt bei 1. Zusammen mit fileName und columnNumber hilft sie dabei, die Stelle im Quelltext zu finden, an der ein Fehler entstanden ist.

Die Eigenschaft ist nicht Teil von ECMAScript und wird nur von der Firefox-Engine SpiderMonkey bereitgestellt. In Chrome, Edge, Safari, Node.js und Deno ist sie undefined. Dort bekommt man die Position des Fehlers nur über den ebenfalls nicht standardisierten, aber überall verfügbaren String error.stack. Alternativ nutzt man bei globalen Fehlern das ErrorEvent, dessen Eigenschaft lineno standardisiert ist.

Man kann lineNumber auch selbst setzen: entweder als drittes Argument des nicht standardisierten Firefox-Konstruktors new Error(message, fileName, lineNumber) oder durch direkte Zuweisung. Die Eigenschaft ist schreibbar und konfigurierbar, aber nicht aufzählbar.

Rückgabewert

Typ
number | undefined
Beschreibung
Eine positive ganze Zahl mit der Zeilennummer (ab 1) in Firefox. In allen anderen Engines ist der Wert undefined, außer er wurde selbst gesetzt.

Beispiele

Zeilennummer eines geworfenen Fehlers auslesen (Firefox)

try {
  throw new Error('Konfiguration fehlt');
} catch (err) {
  // In Firefox eine Zahl, anderswo undefined
  console.log(err.lineNumber);
  console.log(err.fileName);
}
2 https://example.com/app.js

Browserübergreifend: Fallback über error.stack

const getLineNumber = (err) => {
  if (typeof err.lineNumber === 'number') return err.lineNumber;
  // V8/JSC-Format: "at fn (datei.js:12:5)" bzw. Firefox: "fn@datei.js:12:5"
  const match = err.stack?.match(/:(\d+):\d+\)?\s*(?:\n|$)/);
  return match ? Number(match[1]) : null;
};

try {
  JSON.parse('{ungültig}');
} catch (err) {
  console.log(`Fehler in Zeile ${getLineNumber(err) ?? 'unbekannt'}`);
}
Fehler in Zeile 12 (je nach Datei und Engine)

Globale Fehlerprotokollierung mit dem standardisierten ErrorEvent

window.addEventListener('error', (event) => {
  // event.lineno ist standardisiert und funktioniert in allen Browsern
  const report = {
    message: event.message,
    file: event.filename,
    line: event.lineno,
    column: event.colno,
    legacyLine: event.error?.lineNumber // nur Firefox
  };
  console.log(report);
});

setTimeout(() => {
  undefinedFunction();
}, 0);
{ message: "ReferenceError: undefinedFunction is not defined", file: "https://example.com/app.js", line: 14, column: 3, legacyLine: 14 }

lineNumber selbst setzen

const err = new Error('Validierung fehlgeschlagen');
err.lineNumber = 42; // funktioniert in jeder Engine als normale Eigenschaft
console.log(err.lineNumber);
console.log(Object.keys(err).includes('lineNumber'));
42 true

// Wichtig · Fallstricke

  • Nicht standardisiert: Nur Firefox unterstützt lineNumber. Chrome, Safari, Edge, Node.js und Deno liefern undefined. Im Produktivcode nie ohne Fallback verwenden.
  • In Firefox steht die Eigenschaft direkt auf der Instanz. Sie ist dort nicht aufzählbar und erscheint deshalb weder in Object.keys() noch in JSON.stringify(). Wer sie selbst zuweist, erzeugt dagegen eine aufzählbare Eigenschaft.
  • Die Zahl gibt an, wo das Error-Objekt erzeugt wurde, nicht wo es geworfen wurde. Wird ein Fehler vorab erzeugt und erst später mit throw geworfen, zeigt lineNumber auf die Zeile mit new Error().
  • Bei minifiziertem oder transpiliertem Code bezieht sich die Zeile auf die ausgelieferte Datei. Um auf den Originalquelltext zu kommen, braucht man Source Maps.
  • Bei Code aus eval() oder new Function() ist die Zeile relativ zum ausgewerteten String und damit oft wenig aussagekräftig.
  • Bei Skripten von fremden Ursprüngen ohne CORS-Freigabe (crossorigin-Attribut und passender Access-Control-Allow-Origin-Header) schwärzt der Browser die Fehlerdetails in ErrorEvent aus Sicherheitsgründen. Dann ist lineno gleich 0 und die Meldung lautet nur „Script error.“.