Signatur
Beschreibung
Die Dateneigenschaft message beschreibt einen Fehler in Textform. Wenn Sie dem Konstruktor new Error(message) (oder einer Unterklasse wie TypeError, RangeError usw.) ein erstes Argument übergeben, wird es in einen String umgewandelt und als eigene Eigenschaft der Instanz gespeichert. Diese Eigenschaft ist beschreibbar und konfigurierbar, aber nicht aufzählbar.
Ohne Argument (oder mit undefined) legt der Konstruktor keine eigene Eigenschaft an. Dann wird Error.prototype.message aus der Prototypkette gelesen, und das ist der leere String "".
message wird unter anderem von Error.prototype.toString() verwendet. Das Ergebnis hat das Format "Name: Nachricht". Auch die Browser-Konsole und Node.js greifen darauf zurück, wenn ein nicht abgefangener Fehler ausgegeben wird. In der Praxis nutzen Sie message für Logging, für Fehlermeldungen in der Oberfläche und für eigene Fehlerklassen.
Weil die Eigenschaft nicht aufzählbar ist, erscheint sie weder in Object.keys() noch in JSON.stringify(). Zum Serialisieren müssen Sie sie deshalb ausdrücklich übernehmen.
Rückgabewert
"", wenn beim Erzeugen keine Nachricht angegeben wurde. Nicht-String-Argumente werden per String() umgewandelt.Beispiele
Nachricht setzen und auslesen
const err = new Error('Datei konnte nicht geladen werden');
console.log(err.message);
console.log(err.toString());
// Ohne Argument: geerbter leerer String
const leer = new Error();
console.log(JSON.stringify(leer.message), Object.hasOwn(leer, 'message'));
Fehlermeldung im catch-Block anzeigen
const parseConfig = (text) => {
try {
return JSON.parse(text);
} catch (err) {
// err ist hier ein SyntaxError
console.error(`Konfiguration ungültig: ${err.message}`);
return null;
}
};
parseConfig('{ ungültig }');
Eigene Fehlerklasse mit aussagekräftiger Nachricht
class HttpError extends Error {
constructor(status, url) {
super(`HTTP ${status} beim Abruf von ${url}`);
this.name = 'HttpError';
this.status = status;
}
}
const load = async (url) => {
const res = await fetch(url);
if (!res.ok) throw new HttpError(res.status, url);
return res.json();
};
load('https://example.com/nicht-da').catch((err) => {
console.log(err.name, '-', err.message);
});
Fehler korrekt als JSON serialisieren
const err = new RangeError('Wert muss zwischen 1 und 10 liegen');
console.log(JSON.stringify(err)); // message ist nicht aufzählbar
const payload = JSON.stringify({ name: err.name, message: err.message });
console.log(payload);
// Wichtig · Fallstricke
- Nicht aufzählbar:
JSON.stringify(error)liefert"{}". Übernehmen Siemessage,nameund gegebenenfallsstackausdrücklich. - Kein Verlass auf den Wortlaut: Nachrichten von eingebauten Fehlern, etwa aus
JSON.parseoder beiTypeError, unterscheiden sich zwischen V8, SpiderMonkey und JavaScriptCore und können sich mit jeder Version ändern. Unterscheiden Sie Fehler deshalb überinstanceof,nameoder einen eigenencode, nicht über String-Vergleiche mitmessage. - Nicht jeder geworfene Wert ist ein Error: Mit
throw "Text"oderthrow 42geworfene Werte haben keinmessage. Prüfen Sie imcatchdefensiv, zum Beispiel miterr instanceof Error ? err.message : String(err). - Typumwandlung:
new Error({})ergibt die Nachricht"[object Object]". Übergeben Sie daher immer einen String. - Sicherheit: Fehlermeldungen können Nutzereingaben oder interne Details enthalten, etwa Pfade oder SQL-Fragmente. Geben Sie
messagenie ungeprüft perinnerHTMLaus, sondern verwenden SietextContent, um XSS zu vermeiden. Zeigen Sie Endnutzern auch keine internen Details aus Server-Fehlern. - Für verkettete Fehler steht seit ES2022 die Option
causezur Verfügung:new Error(msg, { cause }). So müssen Sie die ursprüngliche Nachricht nicht in den Text einbauen.