Zusammenfassung
Die throw
Anweisung "wirft" eine benutzerdefinierte Exception (Ausnahme). Die Programmausführung der aktuellen Funktion bzw. des globalen Codes wird angehalten (Anweisungen nach throw
werden dann nicht mehr ausgeführt), und die Programmausführung wird an den nächsthöheren catch
Block in der Ausführungshierarchie übergeben. Falls in der gesamten Ausführungschierarchie kein catch
Block definiert wurde, wird das Programm komplett angehalten.
Syntax
throw ausdruck;
ausdruck
- Die zu werfende Ausnahme.
Beschreibung
Verwenden Sie die throw
Anweisung, um eine Ausnahme zu werfen. Wenn Sie eine Ausnahme werfen, bestimmt ausdruck
den Typ der Ausnahme. Als Typ können Objekte (siehe Beispiel unten), als auch skalare Werte, wie Zeichenketten, Zahlen und boolesche Werte verwendet werden. Folgende Beispiele werfen jeweils eine Ausnahme:
throw "Fehler"; // erzeugt Ausnahme mit dem Wert "Fehler" (als String) throw 42; // erzeugt Ausnahme mit dem Wert 42 (als Integer) throw true; // erzeugt Ausnahme mit dem Wert TRUE (als boolescher Wert)
Beachten Sie auch, dass die throw
-Anweisung von der automatic semicolon insertion (ASI) betroffen ist und daher kein Zeilenumbruch zwischen dem throw
Schlüsselwort und dem Ausdruck zulässig ist.
Beispiele
Objekt als Ausnahme werfen
Als Ausnahme kann auch ein Objekt geworfen werden. Auf Eigenschaften des geworfenen Objektes kann dann im catch
Block zugegriffen werden. Im folgenden Beispiel wird in der Funktion divide
versucht Zahl n
durch m
zu dividieren. Falls m
die Zahl 0 ist, wird ein Objekt (als Funktion) vom Typ DivisionException
erzeugt und als Ausnahme geworfen, da Teilen durch 0 nicht möglich ist.
function DivisionException(message) { this.message = message; this.name = "DivisionException"; } function divide(n, m) { if (m == 0) { throw new DivisionException("Teilen durch Null nicht möglich"); } return n / m; } try { // versuche 5 / 2 zu teilen alert(divide(5, 2)); // 2.5 // versuche 5 / 0 zu teilen var ausgabe = divide(5, 0); // diese Zeile wird nie erreicht alert(ausgabe); } catch (e) { // "DivisionException: Teilen durch Null nicht möglich" alert(e.name + ": " + e.message); }
Ausnahmen werden in der Regel als Funktionen definiert und mit dem new
Schlüsselwort als Objekte instantiiert, da es in JavaScript kein direktes Konzept von Konstruktoren gibt, wie in anderen Programmiersprachen. Die Funktion dient dann selbst als Konstruktor. Falls in der catch
Anweisung keine Unterscheidung der Ausnahme benötigt wird (z. B. mit Hilfe des instanceof
Operators - siehe Beispiel unten), kann das Objekt direkt übergeben werden. Aus praktischen Gründen kann im geworfenen Objekt die Methode toString definiert werden, um es später einfacher ausgeben zu können:
try { throw { name: "MyException", message: "Something is wrong", toString: function() { return this.name + ": " + this.message; } }; } catch (e) { alert(e); // "MyException: Something is wrong" }
Unterschiedliche Ausnahmen werfen und unterscheiden
Es ist möglich unterschiedliche Ausnahmen in einem try Block zu werfen und im dazugehörigen catch Block abzufangen. Dies erlaubt ein gezielteres Abfangen von Ausnahmen.
function myException(message) { this.message = message; }; function myOtherException(text) { this.text = text; }; var exceptions = [ "Don't panic! Where is my towel?", 42, new myException("So long, and thanks for all the fish!"), new myOtherException("Deep Thought is still watching..."), ]; for (var i=0; i < exceptions.length; i++) { try { throw exceptions[i]; } catch (e) { if (typeof e === "string") { alert('String exception: ' + e); } else if (typeof e === "number") { alert('Number exception: ' + e); } else if (typeof e === "object") { if (e instanceof myException) { alert("myException: " + e.message); } else if (e instanceof myOtherException) { alert("myOtherException: " + e.text); } } } }
Abgefangene Ausnahmen neu werfen
Die throw
Anweisung kann auch innerhalb eines catch
Blocks verwendet werden, um eine neue oder die bereits abgefangene Ausnahme erneut zu werfen. Alle Anweisungen folgenden Anweisungen im catch
Block werden wieder nicht ausgeführt und die neu geworfene Ausnahme wird an die nächsthöheren catch
Block übergeben. Somit können "Ebenen" entworfen werden, die jeweils nur bestimmte Ausnahmen behandeln.
Folgender Quelltext zeigt "myException: This is an exception!"
an, da der innere catch
Block nicht für Ausnahmen vom Typ myOtherException
zuständig ist und daher diese eine Ebene nach oben weiterleitet.
function myException(message) { this.message = message; }; function myOtherException(text) { this.text = text; }; try { try { throw new myOtherException("This is an exception!"); } catch (e) { if (e instanceof myException) { alert("myException: " + e.message); // wird nicht ausgeführt } else { throw e; // eine Ebene nach oben weiterleiten } } } catch (e) { alert("myException: " + e.text); }
Falls eine Exception durch keinen catch Block abgefangen wird, wird die Ausnahme in der JavaScript Konsole ausgegeben und die Programmausführung komplett unterbrochen.
Spezifikationen
Spezifikation | Status | Kommentar |
---|---|---|
ECMAScript 3rd Edition (ECMA-262) | Standard | Initiale Definition. Implementiert in JavaScript 1.4 |
ECMAScript 5.1 (ECMA-262) Die Definition von 'throw statement' in dieser Spezifikation. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'throw statement' in dieser Spezifikation. |
Standard | |
ECMAScript 2017 Draft (ECMA-262) Die Definition von 'throw statement' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Ja) | (Ja) | (Ja) | (Ja) | (Ja) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Ja) | (Ja) | (Ja) | (Ja) | (Ja) | (Ja) |