Start · Sprachen · JavaScript · Referenz · throw

throw

Anweisung

Die <code>throw</code>-Anweisung wirft eine benutzerdefinierte Ausnahme und übergibt die Kontrolle an den nächsten <code>catch</code>-Block im Call Stack.

seit JavaScript ES3 Kategorie: syntax

Signatur

throw expression;

Beschreibung

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 Call Stack übergeben. Wenn kein catch-Block in den aufrufenden Funktionen existiert, wird das Programm beendet.

Die throw-Anweisung ist in allen Kontexten gültig, in denen Anweisungen verwendet werden können. Ihre Ausführung erzeugt eine Ausnahme, die den Call Stack durchdringt.

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

In der Praxis sollte die geworfene Ausnahme immer ein Error-Objekt oder eine Instanz einer Error-Unterklasse wie RangeError sein. Der Grund dafür ist, dass Code, der den Fehler abfängt, bestimmte Eigenschaften wie message auf dem gefangenen Wert erwarten kann. Zum Beispiel werfen Web-APIs 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. Der Code throw gefolgt von einem Zeilenumbruch wird durch die automatische Semikolon-Einfügung (ASI) in throw; umgewandelt, was ungültiger Code ist, da throw im Gegensatz zu return von einem Ausdruck gefolgt werden muss. Um dieses Problem zu vermeiden (um ASI zu verhindern), können Klammern verwendet werden.

Parameter

Name Typ Default Beschreibung
$expression Pflicht any Der zu werfende Ausdruck.

Rückgabewert

Typ
never
Beschreibung
throw gibt keinen Wert zurück – die Anweisung beendet den aktuellen Ausführungsfluss unwiderruflich. In TypeScript wird der Rückgabetyp von Funktionen, die nur throw enthalten, als never ausgedrückt.

Beispiele

Werfen eines benutzerdefinierten Fehlers

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

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

Fehler natürlicher behandeln mit dem Promise-Konstruktor

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);
}

// Wichtig · Fallstricke

Auf diese Weise geworfene Fehler können vom Aufrufer nicht abgefangen werden und führen zum Absturz des Programms, es sei denn, (a) die readFile-Funktion selbst fängt den Fehler ab, oder (b) das Programm läuft in einem Kontext, der Top-Level-Fehler abfängt.

Siehe auch