throw

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die throw Anweisung wirft eine benutzerdefinierte Ausnahme. Die Ausführung der aktuellen Funktion wird gestoppt (die Anweisungen nach throw werden nicht ausgeführt), und die Kontrolle wird an den ersten catch-Block im Aufrufstapel übergeben. Wenn kein catch-Block unter den aufrufenden Funktionen existiert, wird das Programm beendet.

Probieren Sie es aus

function getRectArea(width, height) {
  if (isNaN(width) || isNaN(height)) {
    throw new Error("Parameter is not a number!");
  }
}

try {
  getRectArea(3, "A");
} catch (e) {
  console.error(e);
  // Expected output: Error: Parameter is not a number!
}

Syntax

js
throw expression;
expression

Der Ausdruck, der geworfen werden soll.

Beschreibung

Die throw Anweisung ist in allen Kontexten gültig, in denen Anweisungen verwendet werden können. Ihre Ausführung erzeugt eine Ausnahme, die den Aufrufstapel durchdringt. Für weitere Informationen zu Fehlerausbreitung und -behandlung siehe Ablaufkontrolle und Fehlerbehandlung.

Auf das throw Schlüsselwort kann jede Art von Ausdruck folgen, zum Beispiel:

js
throw error; // Throws a previously defined value (e.g. within a catch block)
throw new Error("Required"); // Throws a new Error object

In der Praxis sollte die Ausnahme, die Sie werfen, immer ein Error Objekt oder eine Instanz einer Error-Unterklasse, wie zum Beispiel RangeError, sein. Dies liegt daran, dass der Code, der den Fehler abfängt, möglicherweise bestimmte Eigenschaften wie message erwartet, die im abgefangenen Wert vorhanden sein sollten. Zum Beispiel werfen Web-APIs typischerweise DOMException-Instanzen, die von Error.prototype erben.

Automatische Einfügesemikola

Die Syntax verbietet Zeilenendungen zwischen dem throw Schlüsselwort und dem Ausdruck, der geworfen werden soll.

js
throw
new Error();

Der obige Code wird durch automatische Semikolon-Einfügung (ASI) in Folgendes umgewandelt:

js
throw;
new Error();

Dies ist ungültiger Code, denn anders als return muss throw von einem Ausdruck gefolgt werden.

Um dieses Problem zu vermeiden (um ASI zu verhindern), könnten Sie Klammern verwenden:

js
throw (
  new Error()
);

Beispiele

Werfen eines benutzerdefinierten Fehlers

Dieses Beispiel definiert eine Funktion, die einen TypeError wirft, wenn die Eingabe nicht vom erwarteten Typ ist.

js
function isNumeric(x) {
  return ["number", "bigint"].includes(typeof x);
}

function sum(...values) {
  if (!values.every(isNumeric)) {
    throw new TypeError("Can only add numbers");
  }
  return values.reduce((a, b) => a + b);
}

console.log(sum(1, 2, 3)); // 6
try {
  sum("1", "2");
} catch (e) {
  console.error(e); // TypeError: Can only add numbers
}

Werfen eines bestehenden Objekts

Dieses Beispiel ruft eine asynchrone Funktion auf, die auf Rückrufe basiert, und wirft einen Fehler, wenn der Rückruf einen Fehler erhält.

js
readFile("foo.txt", (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
});

Fehler, die auf diese Weise geworfen werden, sind für den Aufrufer nicht abfangbar und führen zum Absturz des Programms, es sei denn, (a) die readFile-Funktion fängt den Fehler selbst ab oder (b) das Programm wird in einem Kontext ausgeführt, der Fehler auf oberster Ebene abfängt. Sie können Fehler auf natürlicher Weise handhaben, indem Sie den Promise() Konstruktor verwenden.

js
function readFilePromise(path) {
  return new Promise((resolve, reject) => {
    readFile(path, (err, data) => {
      if (err) {
        reject(err);
      }
      resolve(data);
    });
  });
}

try {
  const data = await readFilePromise("foo.txt");
  console.log(data);
} catch (err) {
  console.error(err);
}

Spezifikationen

Specification
ECMAScript® 2025 Language Specification
# sec-throw-statement

Browser-Kompatibilität

Siehe auch