Start · Sprachen · JavaScript · Referenz · ErrorEvent.lineno

ErrorEvent.lineno

Eigenschaft

Schreibgeschützte Ganzzahl mit der Zeilennummer der Skriptdatei, in der der Fehler aufgetreten ist, der das <code>ErrorEvent</code> ausgelöst hat.

seit JavaScript Baseline: alle Browser (auch in Web Workern verfüg Kategorie: webapi

Signatur

ErrorEvent.lineno

Beschreibung

Die schreibgeschützte Eigenschaft lineno eines ErrorEvent gibt die Zeilennummer an, in der ein nicht abgefangener Laufzeitfehler aufgetreten ist. Die Zählung beginnt bei 1. Zusammen mit filename und colno bestimmt sie die genaue Position des Fehlers im Quelltext.

Du brauchst lineno vor allem beim globalen Fehler-Logging: Mit window.addEventListener("error", …) oder im error-Ereignis eines Worker kannst du Fehler samt Position an einen Monitoring-Dienst schicken. So lassen sich Fehler in Produktionsumgebungen nachvollziehen, auch wenn die Nutzer keine Entwicklerwerkzeuge offen haben.

Wenn der Browser keine Positionsangabe liefern kann oder darf, ist der Wert 0. Das passiert zum Beispiel bei Skripten von fremden Ursprüngen ohne CORS-Freigabe. Bei minifiziertem Code bezieht sich lineno auf die ausgelieferte Datei und nicht auf den Originalquelltext. Um auf die ursprüngliche Zeile zu kommen, brauchst du Source Maps.

Rückgabewert

Typ
number
Beschreibung
Eine ganze Zahl ab 1 mit der Zeilennummer des Fehlers. Ist keine Angabe verfügbar, ist der Wert 0.

Beispiele

Globalen Fehler mit Position protokollieren

window.addEventListener("error", (event) => {
  console.log(`Fehler: ${event.message}`);
  console.log(`Datei: ${event.filename}`);
  console.log(`Position: Zeile ${event.lineno}, Spalte ${event.colno}`);
});

// Absichtlicher Fehler, z. B. in app.js Zeile 8
setTimeout(() => {
  undefinedFunction();
}, 0);
Fehler: Uncaught ReferenceError: undefinedFunction is not defined Datei: https://example.com/app.js Position: Zeile 8, Spalte 3

Fehler an einen Monitoring-Endpunkt senden

window.addEventListener("error", (event) => {
  const report = {
    message: event.message,
    file: event.filename,
    line: event.lineno || null, // 0 = unbekannt
    column: event.colno || null,
    stack: event.error?.stack ?? null,
    url: location.href,
    time: new Date().toISOString()
  };
  navigator.sendBeacon("/api/errors", JSON.stringify(report));
});

Fehler aus einem Web Worker auswerten

// main.js
const worker = new Worker("worker.js");

worker.addEventListener("error", (event) => {
  event.preventDefault(); // Standardausgabe in der Konsole unterdrücken
  console.warn(`Worker-Fehler in ${event.filename}:${event.lineno} – ${event.message}`);
});

// worker.js (Zeile 1)
// throw new Error("Berechnung fehlgeschlagen");
Worker-Fehler in https://example.com/worker.js:1 – Uncaught Error: Berechnung fehlgeschlagen

Eigenes ErrorEvent mit lineno erzeugen

const evt = new ErrorEvent("error", {
  message: "Testfehler",
  filename: "test.js",
  lineno: 42,
  colno: 7
});

console.log(evt.lineno);
evt.lineno = 100; // wird ignoriert (schreibgeschützt)
console.log(evt.lineno);
42 42

// Wichtig · Fallstricke

  • Skripte von fremden Ursprüngen: Kommt der Fehler aus einem Skript eines anderen Ursprungs, das ohne crossorigin-Attribut und passenden Access-Control-Allow-Origin-Header geladen wurde, bekommst du nur "Script error." zu sehen. lineno ist dann 0 und filename leer. Abhilfe: <script src="…" crossorigin="anonymous"> plus einen CORS-Header auf dem Server.
  • Minifizierung und Bundler: Die Zeilennummer gilt für die ausgelieferte Datei. Bei minifiziertem Code steht oft fast alles in Zeile 1. Für aussagekräftige Angaben brauchst du Source Maps.
  • Abweichungen zwischen Browsern: Bei Inline-Skripten, eval() oder new Function() zählen die Browser die Zeilen teilweise unterschiedlich, zum Beispiel relativ zum HTML-Dokument oder zum ausgewerteten Code.
  • Kein Ereignis für Promise-Fehler: Bei abgelehnten Promises, die niemand abfängt, wird kein ErrorEvent ausgelöst, sondern das Ereignis unhandledrejection. Die Position findest du dort nur über event.reason?.stack.
  • Im Handler window.onerror = (message, source, lineno, colno, error) => {} kommt die Zeilennummer als drittes Argument an und nicht als Ereignis-Objekt.
  • Die Eigenschaft ist schreibgeschützt. Eigene Werte setzt du nur über das Initialisierungsobjekt von new ErrorEvent().