Start · Sprachen · JavaScript · Referenz · new EvalError()

new EvalError()

Methode

Der Konstruktor <code>EvalError()</code> erzeugt ein neues <code>EvalError</code>-Objekt, das einen Fehler im Zusammenhang mit der globalen Funktion <code>eval()</code> darstellt.

seit JavaScript ES1 (options.cause: ES2022) Kategorie: method-property

Signatur

new EvalError(message, options)

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

Typ
EvalError
Beschreibung
Ein neues 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));
true true EvalError Ungültiger Ausdruck EvalError: Ungültiger Ausdruck

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;
    }
  }
}
2 * (3 + 4) => 14 EvalError: Unerlaubte Zeichen in "alert(1)" EvalError: Ausdruck konnte nicht ausgewertet werden SyntaxError

Aufruf ohne new

const err = EvalError('Auch ohne new');
console.log(err instanceof EvalError, err.message);
true Auch ohne new

// Wichtig · Fallstricke

  • Wird von der Engine nicht mehr geworfen: Fehler innerhalb von eval() erscheinen als SyntaxError, ReferenceError usw. – nie als EvalError. Ein catch auf EvalError fängt also nur selbst geworfene Fehler.
  • Die Option cause gibt es erst seit ES2022 (Chrome 93, Firefox 91, Safari 15, Node.js 16.9). Ältere Umgebungen ignorieren das zweite Argument stillschweigend.
  • stack ist nicht standardisiert; Format und Verfügbarkeit hängen von der Engine ab.
  • Sicherheit: eval() und new Function() führen beliebigen Code aus (XSS-Risiko) und werden durch eine Content-Security-Policy ohne 'unsafe-eval' blockiert – dann wirft der Browser einen EvalError (in Chromium/Firefox als CSP-Verletzung). Eingaben vorher strikt validieren oder einen echten Parser verwenden.
  • Für eigene Fehlerkategorien ist class MyError extends Error meist klarer als die Wiederverwendung von EvalError.