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 löst eine benutzerdefinierte Ausnahme aus. 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 durch den Aufrufstapel dringt. Weitere Informationen zum Fehler-Bubbling und zur Fehlerbehandlung finden Sie unter Ablaufsteuerung und Fehlerbehandlung.

Das throw-Schlüsselwort kann von jeder Art von Ausdruck gefolgt werden, 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 von Ihnen geworfene Ausnahme immer ein Error-Objekt oder eine Instanz einer Error-Unterklasse wie z.B. RangeError sein. Dies liegt daran, dass Code, der den Fehler auffängt, möglicherweise erwartet, dass bestimmte Eigenschaften wie message im aufgefangenen Wert vorhanden sind. Web-APIs werfen beispielsweise typischerweise DOMException-Instanzen, die von Error.prototype erben.

Automatische Semikolon-Einfügung

Die Syntax verbietet Zeilenumbrüche zwischen dem throw-Schlüsselwort und dem zu werfenden Ausdruck.

js
throw
new Error();

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

js
throw;
new Error();

Dies ist ungültiger Code, da im Gegensatz zu return throw von einem Ausdruck gefolgt werden muss.

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 vorhandenen Objekts

Dieses Beispiel ruft eine asynchrone Funktion, die auf Rückrufe basiert, auf 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, können vom Aufrufer nicht abgefangen werden und führen zum Absturz des Programms, es sei denn, (a) die readFile-Funktion fängt den Fehler selbst ab oder (b) das Programm läuft in einem Kontext, der Top-Level-Fehler auffängt. Sie können Fehler natürlicher 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® 2026 Language Specification
# sec-throw-statement

Browser-Kompatibilität

Siehe auch