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 wird verwendet, um eine benutzerdefinierte Ausnahme auszulösen. 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 in den aufrufenden Funktionen vorhanden ist, 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
throw expression;
expression
-
Der Ausdruck, der ausgelöst werden soll.
Beschreibung
Die throw
-Anweisung ist in allen Kontexten gültig, in denen Anweisungen verwendet werden können. Ihre Ausführung generiert eine Ausnahme, die durch den Aufrufstapel weitergeleitet wird. Weitere Informationen zur Fehlerweitergabe und -behandlung finden Sie unter Kontrollfluss und Fehlerbehandlung.
Das throw
-Schlüsselwort kann von jedem beliebigen Ausdruck gefolgt sein, zum Beispiel:
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 auslösen, immer ein Error
-Objekt oder eine Instanz einer Error
-Unterklasse sein, wie z.B. RangeError
. Der Grund dafür ist, dass Code, der den Fehler abfängt, bestimmte Eigenschaften, wie z.B. message
, auf dem aufgefangenen Wert erwartet. Beispielsweise werfen Web-APIs in der Regel DOMException
-Instanzen, die von Error.prototype
erben.
Automatische Semikolon-Einfügung
Die Syntax verbietet Zeilenumbrüche zwischen dem throw
-Schlüsselwort und dem Ausdruck, der ausgelöst werden soll.
throw
new Error();
Der obige Code wird durch automatische Semikolon-Einfügung (ASI) wie folgt transformiert:
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önnen Sie Klammern verwenden:
throw (
new Error()
);
Beispiele
Auslösen eines benutzerdefinierten Fehlers
Dieses Beispiel definiert eine Funktion, die einen TypeError
auslöst, wenn die Eingabe nicht dem erwarteten Typ entspricht.
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
}
Auslösen eines vorhandenen Objekts
Dieses Beispiel ruft eine Callback-basierte asynchrone Funktion auf und löst einen Fehler aus, wenn der Callback einen Fehler erhält.
readFile("foo.txt", (err, data) => {
if (err) {
throw err;
}
console.log(data);
});
Fehler, die auf diese Weise ausgelöst werden, können vom Aufrufer nicht abgefangen werden und führen zum Absturz des Programms, es sei denn, (a) die Funktion readFile
fängt den Fehler selbst ab oder (b) das Programm läuft in einem Kontext, der Fehler auf oberster Ebene abfängt. Sie können Fehler natürlicher behandeln, indem Sie den Promise()
-Konstruktor verwenden.
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 |