Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

throw

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨Juli 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