Start · Sprachen · JavaScript · Referenz · WorkerGlobalScope.reportError()

WorkerGlobalScope.reportError()

Methode

Meldet einen Fehler im Worker so, als wäre er eine nicht abgefangene Ausnahme: Es wird ein <code>error</code>-Ereignis am globalen Scope ausgelöst und der Fehler in der Konsole ausgegeben.

seit JavaScript Baseline 2022: Chrome 95, Firefox 93, Safari 15.4, Kategorie: webapi

Signatur

WorkerGlobalScope.reportError(throwable)

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

Typ
void
Beschreibung
Kein 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);
Uncaught Error: Listener 1 defekt (Konsole) Listener 2 erhielt: 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');
Gemeldet: Uncaught TypeError: Ungültige Nachricht | Wert: TypeError: Ungültige Nachricht 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);
};
Fehler aus dem Worker: Uncaught RangeError: Zahl erwartet, erhalten: string (worker.js:4)

// Wichtig · Fallstricke

  • Kein Abbruch: Im Gegensatz zu throw läuft der Code nach dem Aufruf weiter. Soll eine Funktion abbrechen, brauchst du zusätzlich ein return.
  • Nur für Laufzeitfehler, nicht für Promise-Ablehnungen: Es wird error ausgelöst, nicht unhandledrejection.
  • 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-Handler event.preventDefault() auf, entfällt die Konsolenausgabe. Beim Dedicated Worker wird der Fehler dann auch nicht an worker.onerror im Haupt-Thread weitergereicht.
  • Übergibst du Werte, die kein Error sind, kann die Konsolenmeldung wenig aussagekräftig sein. Verwende deshalb möglichst Error-Instanzen.
  • Kompatibilität: Verfügbar seit etwa 2021/2022 in allen modernen Browsern, nicht im Internet Explorer. Node.js stellt kein globales reportError bereit. Ein Fallback ist setTimeout(() => { throw err; }).