Signatur
Beschreibung
Mit new Error() erzeugt man ein Fehlerobjekt, das man meist direkt mit throw auslöst. Das Objekt hat die Eigenschaften message und name (standardmäßig "Error"). In allen gängigen Umgebungen kommt außerdem die nicht standardisierte, aber weit unterstützte Eigenschaft stack mit dem Aufrufstapel hinzu, der beim Erzeugen des Objekts festgehalten wird.
Seit ES2022 kann man als zweites Argument ein Optionsobjekt mit der Eigenschaft cause übergeben. Damit lassen sich Fehler verketten: Ein technischer Fehler auf niedriger Ebene (z. B. ein Netzwerkfehler) wird in einen aussagekräftigeren Fehler der Anwendung eingepackt, ohne dass die ursprüngliche Information verloren geht.
Error kann auch ohne new aufgerufen werden – Error("x") verhält sich genauso wie new Error("x"). Für eigene Fehlertypen leitet man mit class MyError extends Error ab. Für bestimmte Fälle gibt es schon eingebaute Unterklassen wie TypeError, RangeError oder SyntaxError.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $message | string | "" | Lesbare Beschreibung des Fehlers. Andere Werte als Strings werden mit String() umgewandelt. Wird nichts übergeben, bekommt die Instanz keine eigene message-Eigenschaft; es gilt dann der leere String vom Prototyp. |
| $options | { cause?: any } | Optionsobjekt. cause gibt die ursprüngliche Ursache des Fehlers an und wird als Eigenschaft error.cause übernommen. Das kann ein beliebiger Wert sein, meist ist es ein anderes Error-Objekt. |
Rückgabewert
Error-Objekt mit den Eigenschaften message, name, gegebenenfalls cause und meist auch stack.Beispiele
Einfachen Fehler erzeugen und abfangen
const teile = (a, b) => {
if (b === 0) {
throw new Error('Division durch null ist nicht erlaubt');
}
return a / b;
};
try {
teile(10, 0);
} catch (err) {
console.log(err.name);
console.log(err.message);
console.log(err instanceof Error);
}
Fehler verketten mit cause (ES2022)
const ladeBenutzer = async (id) => {
try {
const res = await fetch(`/api/users/${id}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
throw new Error(`Benutzer ${id} konnte nicht geladen werden`, { cause: err });
}
};
try {
await ladeBenutzer(42);
} catch (err) {
console.log(err.message);
console.log('Ursache:', err.cause?.message);
}
Eigene Fehlerklasse ableiten
class ValidationError extends Error {
constructor(field, message, options) {
super(message, options);
this.name = 'ValidationError';
this.field = field;
}
}
const pruefeAlter = (alter) => {
if (!Number.isInteger(alter) || alter < 0) {
throw new ValidationError('alter', `Ungültiges Alter: ${alter}`);
}
return alter;
};
try {
pruefeAlter(-3);
} catch (err) {
if (err instanceof ValidationError) {
console.log(`${err.name} [${err.field}]: ${err.message}`);
}
}
Aufruf ohne new und toString()
const e = Error('Etwas ging schief');
console.log(e instanceof Error);
console.log(String(e));
console.log(new Error().message === '');
// Wichtig · Fallstricke
- Nur Fehlerobjekte werfen:
throw 'Text'funktioniert zwar, liefert aber wederstacknochinstanceof Error. Werfen Sie immerError-Instanzen. stackist nicht standardisiert: Aufbau und Inhalt unterscheiden sich zwischen V8 (Chrome, Node.js), SpiderMonkey (Firefox) und JavaScriptCore (Safari). Werten Sie den Stack nicht maschinell aus. In V8 kannError.captureStackTrace()den Stack gezielt anpassen.cause: Wird in Chrome 93+, Firefox 91+, Safari 15+ und Node.js 16.9+ unterstützt. Ältere Umgebungen ignorieren das Optionsobjekt stillschweigend.- Unterklassen: Setzen Sie in eigenen Fehlerklassen
this.name, sonst meldet sich der Fehler als"Error". Beim Transpilieren nach ES5 kanninstanceofohneObject.setPrototypeOf(this, new.target.prototype)fehlschlagen. - Serialisierung:
JSON.stringify(new Error('x'))ergibt{}, weilmessageundstacknicht aufzählbar sind. Übertragen Sie die Felder daher einzeln oder nutzen SiestructuredClone(). - Sicherheit: Geben Sie Stack-Traces und interne Fehlermeldungen nicht ungefiltert an Endnutzer oder API-Clients weiter. Sie können Pfade, Code-Aufbau oder sensible Daten preisgeben.