throw

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)

Siehe auch

Schlagwörter des Dokuments und Mitwirkende

 Mitwirkende an dieser Seite: StanE
 Zuletzt aktualisiert von: StanE,