Signatur
Beschreibung
Der Konstruktor SuppressedError() erzeugt einen Fehler, der zwei Fehler zusammenfasst: den Fehler, der zuletzt aufgetreten ist (error), und einen früheren Fehler, der dadurch verdrängt wurde (suppressed). So geht bei der Fehlerbehandlung keine Information verloren.
Gedacht ist der Typ vor allem für die explizite Ressourcenverwaltung mit using, await using, DisposableStack und AsyncDisposableStack. Wirft ein Codeblock einen Fehler und schlägt danach auch das Aufräumen ([Symbol.dispose]()) fehl, erzeugt die Laufzeitumgebung automatisch einen SuppressedError: In error steht der Fehler beim Aufräumen, in suppressed der ursprüngliche Fehler aus dem Block.
Du kannst den Konstruktor auch selbst aufrufen, zum Beispiel in eigenen Aufräumroutinen mit try…finally, wenn im finally-Block ein zweiter Fehler auftritt. Der Aufruf funktioniert mit und ohne new. Das Ergebnis ist eine Instanz von SuppressedError und Error, der name ist "SuppressedError".
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $error Pflicht | any | Der zuletzt aufgetretene Fehler, der den früheren verdrängt. Er wird in der Eigenschaft error gespeichert. Jeder Wert ist erlaubt, nicht nur Error-Objekte. |
|
| $suppressed Pflicht | any | Der frühere Fehler, der verdrängt wurde. Er wird in der Eigenschaft suppressed gespeichert. |
|
| $message | string | "" (geerbt von Error.prototype.message) | Optionale, lesbare Fehlermeldung. Werte, die keine Zeichenketten sind, werden in Zeichenketten umgewandelt. Fehlt der Parameter, wird keine eigene message-Eigenschaft angelegt. |
Rückgabewert
SuppressedError-Objekt mit den eigenen Eigenschaften error, suppressed und, falls angegeben, message.Beispiele
SuppressedError direkt erzeugen
const cleanupError = new Error('Datei konnte nicht geschlossen werden');
const originalError = new TypeError('Ungültiges Format');
const err = new SuppressedError(cleanupError, originalError, 'Fehler beim Verarbeiten');
console.log(err instanceof SuppressedError); // true
console.log(err instanceof Error); // true
console.log(err.name); // SuppressedError
console.log(err.message);
console.log(err.error.message);
console.log(err.suppressed.message);
Automatisch erzeugt durch DisposableStack
const stack = new DisposableStack();
stack.defer(() => {
throw new Error('Aufräumen fehlgeschlagen');
});
try {
try {
throw new Error('Verarbeitung fehlgeschlagen');
} finally {
stack.dispose();
}
} catch (e) {
// dispose() wirft hier nur den Aufräumfehler; die Kombination
// entsteht bei using bzw. bei mehreren fehlschlagenden Callbacks
console.log(e.message);
}
// Mehrere fehlschlagende Aufräum-Callbacks:
const stack2 = new DisposableStack();
stack2.defer(() => { throw new Error('A'); });
stack2.defer(() => { throw new Error('B'); });
try {
stack2.dispose(); // Reihenfolge LIFO: erst B, dann A
} catch (e) {
console.log(e.name, e.error.message, e.suppressed.message);
}
Eigene Aufräumlogik mit try…finally
const withConnection = async (task) => {
const conn = { close: async () => { throw new Error('Verbindung hängt'); } };
let taskError;
try {
return await task(conn);
} catch (e) {
taskError = e;
throw e;
} finally {
try {
await conn.close();
} catch (closeError) {
// Keinen Fehler verlieren: beide zusammen weiterreichen
if (taskError !== undefined) {
throw new SuppressedError(closeError, taskError, 'Task und Cleanup fehlgeschlagen');
}
throw closeError;
}
}
};
try {
await withConnection(async () => { throw new Error('Query fehlgeschlagen'); });
} catch (e) {
console.log(e.message);
console.log('Cleanup:', e.error.message);
console.log('Ursprung:', e.suppressed.message);
}
// Wichtig · Fallstricke
- Reihenfolge der Argumente beachten: Das erste Argument (
error) ist der neuere Fehler, das zweite (suppressed) der ältere, verdrängte. Wer das vertauscht, zeigt in Logs die falsche Ursache. - Anders als
Error()hat der Konstruktor keinenoptions-Parameter, also kein{ cause }. Die Verknüpfung läuft übererrorundsuppressed. - Bei mehreren fehlschlagenden Aufräum-Schritten entstehen verschachtelte
SuppressedError-Objekte. Zum vollständigen Loggen musst du rekursiv übersuppressedgehen. - Kompatibilität: Der Typ gehört zum Vorschlag „Explicit Resource Management“ und ist neu. In älteren Browsern und in Safari fehlt
SuppressedError. Prüfe vor der Nutzung mittypeof SuppressedError !== 'undefined'oder setze ein Polyfill ein (z. B.core-js). TypeScript unterstützt den Typ ab 5.2 mitlib: ["esnext.disposable"].