Signatur
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
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 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");
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);
// Wichtig · Fallstricke
- Skripte von fremden Ursprüngen: Kommt der Fehler aus einem Skript eines anderen Ursprungs, das ohne
crossorigin-Attribut und passendenAccess-Control-Allow-Origin-Header geladen wurde, bekommst du nur"Script error."zu sehen.linenoist dann0undfilenameleer. 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()odernew 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
ErrorEventausgelöst, sondern das Ereignisunhandledrejection. Die Position findest du dort nur überevent.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().