Signatur
Beschreibung
Der Konstruktor EvalError() erzeugt Fehlerobjekte vom Typ EvalError. Dieser Fehlertyp war ursprünglich dafür gedacht, eine fehlerhafte Verwendung der globalen Funktion eval() anzuzeigen. Die JavaScript-Engine selbst wirft seit ECMAScript 5 keinen EvalError mehr, der Typ existiert aber aus Gründen der Abwärtskompatibilität weiter.
Man kann EvalError() mit oder ohne new aufrufen, beide Varianten liefern eine neue Instanz. Das Objekt erbt von Error und besitzt daher die Eigenschaften message, name (immer "EvalError"), optional cause und in den meisten Engines stack.
In der Praxis ist der Konstruktor nur noch nützlich, wenn man in eigenem Code einen Fehler rund um dynamische Code-Ausführung (z. B. einen eigenen Ausdrucks-Interpreter oder eine Sandbox für eval/new Function) signalisieren und dabei per instanceof EvalError unterscheidbar machen möchte. Für die meisten Fälle sind eigene Fehlerklassen (class MyError extends Error) jedoch aussagekräftiger.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $message | string | "" | Menschenlesbare Fehlerbeschreibung. Wird in einen String umgewandelt und als message-Eigenschaft gesetzt. |
| $options | object | Optionsobjekt. Unterstützt die Eigenschaft cause, mit der die ursprüngliche Fehlerursache angehängt wird (ES2022). |
|
| $options.cause | any | Beliebiger Wert (meist ein anderer Fehler), der als cause-Eigenschaft der Instanz gespeichert wird. |
Rückgabewert
EvalError-Objekt mit gesetzter message, name === "EvalError" und ggf. cause.Beispiele
EvalError erzeugen und auswerten
const err = new EvalError('Ungültiger Ausdruck');
console.log(err instanceof EvalError); // true
console.log(err instanceof Error); // true
console.log(err.name); // "EvalError"
console.log(err.message); // "Ungültiger Ausdruck"
console.log(String(err));
Eigene Ausdrucksauswertung mit EvalError und cause
const evaluate = (expr) => {
// Nur Ziffern, Leerzeichen und Grundrechenarten zulassen
if (!/^[\d\s+\-*/().]+$/.test(expr)) {
throw new EvalError(`Unerlaubte Zeichen in "${expr}"`);
}
try {
return new Function(`return (${expr});`)();
} catch (e) {
throw new EvalError('Ausdruck konnte nicht ausgewertet werden', { cause: e });
}
};
for (const expr of ['2 * (3 + 4)', 'alert(1)', '2 * (3']) {
try {
console.log(expr, '=>', evaluate(expr));
} catch (e) {
if (e instanceof EvalError) {
console.log(`${e.name}: ${e.message}`, e.cause?.name ?? '');
} else {
throw e;
}
}
}
Aufruf ohne new
const err = EvalError('Auch ohne new');
console.log(err instanceof EvalError, err.message);
// Wichtig · Fallstricke
- Wird von der Engine nicht mehr geworfen: Fehler innerhalb von
eval()erscheinen alsSyntaxError,ReferenceErrorusw. – nie alsEvalError. EincatchaufEvalErrorfängt also nur selbst geworfene Fehler. - Die Option
causegibt es erst seit ES2022 (Chrome 93, Firefox 91, Safari 15, Node.js 16.9). Ältere Umgebungen ignorieren das zweite Argument stillschweigend. stackist nicht standardisiert; Format und Verfügbarkeit hängen von der Engine ab.- Sicherheit:
eval()undnew Function()führen beliebigen Code aus (XSS-Risiko) und werden durch eine Content-Security-Policy ohne'unsafe-eval'blockiert – dann wirft der Browser einenEvalError(in Chromium/Firefox als CSP-Verletzung). Eingaben vorher strikt validieren oder einen echten Parser verwenden. - Für eigene Fehlerkategorien ist
class MyError extends Errormeist klarer als die Wiederverwendung vonEvalError.