Signatur
Beschreibung
Mit self.reportError() meldest du in einem Web Worker (Dedicated, Shared oder Service Worker) einen Fehler genau so, wie die Laufzeitumgebung eine nicht abgefangene Ausnahme meldet. Dabei wird am WorkerGlobalScope ein ErrorEvent vom Typ error ausgelöst. Handler, die per self.onerror oder self.addEventListener("error", …) registriert sind, erhalten es, und der Fehler landet in der Entwicklerkonsole. Beim Dedicated Worker wird ein nicht behandelter Fehler außerdem an das Worker-Objekt im Haupt-Thread weitergereicht (worker.onerror).
Die Methode ist vor allem für Bibliotheken und Frameworks gedacht, zum Beispiel für Event-Emitter, Aufgaben-Warteschlangen oder Callback-Systeme. Sie fangen Fehler in Benutzer-Callbacks ab, damit die eigene Verarbeitung weiterläuft, sollen den Fehler aber trotzdem sichtbar machen. Früher griff man dazu auf setTimeout(() => { throw err; }) zurück. reportError() macht dasselbe synchron und ohne Umweg über die Ereignisschleife.
Wichtig: reportError() unterbricht den aktuellen Kontrollfluss nicht. Der Code nach dem Aufruf läuft ganz normal weiter. Übergeben werden kann jeder beliebige Wert. Ist es ein Error-Objekt, stehen Nachricht, Dateiname, Zeile und Spalte im ErrorEvent. Den Originalwert findest du in event.error.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $throwable Pflicht | any | Der zu meldende Fehler, meist eine Error-Instanz. Beliebige Werte sind erlaubt und stehen im Ereignis als event.error zur Verfügung. |
Rückgabewert
undefined). Die Wirkung besteht allein darin, dass ein error-Ereignis ausgelöst und der Fehler in der Konsole ausgegeben wird.Beispiele
Fehler in Callbacks melden, ohne die Verarbeitung abzubrechen
// worker.js
const listeners = [];
const on = (fn) => listeners.push(fn);
const emit = (data) => {
for (const fn of listeners) {
try {
fn(data);
} catch (err) {
// Fehler melden, aber die übrigen Listener trotzdem ausführen
self.reportError(err);
}
}
};
on(() => { throw new Error('Listener 1 defekt'); });
on((d) => console.log('Listener 2 erhielt:', d));
emit(42);
Gemeldete Fehler im Worker zentral abfangen
// worker.js
self.addEventListener('error', (event) => {
console.log('Gemeldet:', event.message, '| Wert:', event.error);
// Mit preventDefault() unterdrückst du die Standard-Konsolenausgabe
event.preventDefault();
});
self.reportError(new TypeError('Ungültige Nachricht'));
console.log('Code läuft weiter');
Weiterleitung an den Haupt-Thread (Dedicated Worker)
// main.js
const worker = new Worker('worker.js');
worker.onerror = (event) => {
console.log('Fehler aus dem Worker:', event.message, `(${event.filename}:${event.lineno})`);
};
// worker.js
self.onmessage = ({ data }) => {
if (typeof data !== 'number') {
self.reportError(new RangeError(`Zahl erwartet, erhalten: ${typeof data}`));
return;
}
self.postMessage(data * 2);
};
// Wichtig · Fallstricke
- Kein Abbruch: Im Gegensatz zu
throwläuft der Code nach dem Aufruf weiter. Soll eine Funktion abbrechen, brauchst du zusätzlich einreturn. - Nur für Laufzeitfehler, nicht für Promise-Ablehnungen: Es wird
errorausgelöst, nichtunhandledrejection. - Mehr als nur Protokollieren: Anders als
console.error()werden globale Fehlerhandler ausgelöst. Fehler-Tracking-Werkzeuge (z. B. Sentry) erfassen den Fehler dadurch automatisch. - Ruft ein
error-Handlerevent.preventDefault()auf, entfällt die Konsolenausgabe. Beim Dedicated Worker wird der Fehler dann auch nicht anworker.onerrorim Haupt-Thread weitergereicht. - Übergibst du Werte, die kein
Errorsind, kann die Konsolenmeldung wenig aussagekräftig sein. Verwende deshalb möglichstError-Instanzen. - Kompatibilität: Verfügbar seit etwa 2021/2022 in allen modernen Browsern, nicht im Internet Explorer. Node.js stellt kein globales
reportErrorbereit. Ein Fallback istsetTimeout(() => { throw err; }).