Skip to content

9. Fehler und Ausnahmen

Image

JavaScript verfügt nicht über ein sehr ausgefeiltes Ausnahmesystem. Es bietet jedoch die Anweisung [throw], mit der ein Fehler gemeldet werden kann, sowie die try/catch/finally-Struktur, mit der diese Fehler abgefangen werden können.

9.1. Skript [excep-01]

Im folgenden Skript werden wir das aktuelle Datum im Format [heures:minutes:secondes:millisecondes] anzeigen. Dazu verwenden wir eine Bibliothek namens jS. Wir installieren sie wie gewohnt mit dem Tool [npm]:

Image

Der Skriptcode lautet wie folgt:


'use strict';

// Paket „moment“
import moment from 'moment';

...

Um zu erfahren, wie die Zeile [import] in Zeile 4 geschrieben wird, kann man sich die Definition des Moduls [moment] ansehen:

Image

  • Bei [1-2] gelangt man zur Definition des Moduls;
  • bei [3] handelt es sich um eine TypeScript-Datei, nicht um JavaScript. Bei der Ausführung wird diese TypeScript-Datei in eine JavaScript-Datei kompiliert, bevor sie verwendet wird;
  • In [4] suchen wir nach den Anweisungen in [export] (Strg+F);
  • In [5] exportiert die Anweisung das Objekt [moment]. Dieses kann wie folgt in ES6 importiert werden:

import moment from 'moment';

Zum Importieren des Objekts [moment] kann ein beliebiger Name verwendet werden, zum Beispiel:


import m from 'moment';

Kommen wir nun zurück zum Skriptcode:


'use strict';

// Paket „moment“
import moment from 'moment';

// Prinzip von try / catch / finally
for (let i = 0; i < 10; i++) {
  // Datum und Uhrzeit des aktuellen Zeitpunkts
  const now = Date.now();
  // Formatierung der Uhrzeit zur Ermittlung der Millisekunden
  const time = moment(now).format("HH:mm:ss:SSS");
  // die Millisekunden
  const milli = Number(time.substr(time.length - 3));
  // Anzeige
  console.log("--------------------itération n° ", i, "à", time);
  try {
    // Anzahl variiert je nach aktueller Uhrzeit
    const nbre = milli % 2;
    if (nbre === 0) {
      // Fehlermeldung ausgeben
      throw "erreur";
    }
    // Wenn man hierher gelangt, liegt kein Fehler vor
    console.log("pas d'erreur");
  } catch (error) {
    // Wenn man hierher gelangt, ist ein Fehler aufgetreten
    console.log("erreur1=", error);
  } finally {
    // wird in jedem Fall ausgeführt, egal ob ein Fehler vorliegt oder nicht
    console.log("finally")
  }
}

Kommentare

  • Zeile 4: Import der Bibliothek [moment];
  • Das Skript läuft in einer Schleife, die 10 Mal durchlaufen wird (Zeile 7). Bei jedem Durchlauf der Schleife wird die aktuelle Uhrzeit im Format [heures:minutes:secondes:millisecondes] abgerufen (Zeilen 8–13);
  • Wenn die Anzahl der Millisekunden gerade ist, wird eine Fehlermeldung ausgegeben (Zeilen 19–22);
  • Hier geht es darum, die Funktionsweise von try / catch / finally zu verstehen

Ausführung


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-01.js"
--------------------itération n° 0 à 17:57:04:440
erreur1= erreur
finally
--------------------itération n° 1 à 17:57:04:447
pas d'erreur
finally
--------------------itération n° 2 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 3 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 4 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 5 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 6 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 7 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 8 à 17:57:04:449
pas d'erreur
finally
--------------------itération n° 9 à 17:57:04:449
pas d'erreur
finally

Man sieht, dass die Anweisung [finally] immer ausgeführt wird, unabhängig davon, ob ein Fehler vorliegt oder nicht.

9.2. Skript [excep-02]

Dieses Skript, das durch die Anweisung [throw] aufgerufen werden kann, kann beliebige Datentypen ausgeben, und diese Daten werden vollständig von der Klausel [catch] übernommen.


'use strict';

// Man kann so gut wie alles „auslösen“ (throw), um einen Fehler zu melden
let i = 0;
console.log("--------------------essai n° ", i);
// Eine Zeichenkette auslösen
try {
  throw "msg d'erreur";
} catch (error) {
  // Es ist ein Fehler aufgetreten
  console.log("erreur=[", error, "], type=", typeof (error));
}
// eine Tabelle erstellen
i++;
console.log("--------------------essai n° ", i);
try {
  throw [1, 2, 3]
} catch (error) {
  // Es ist ein Fehler aufgetreten
  console.log("erreur=[", error, "], type=", typeof (error));
}
// ein Objektliteral auslösen
i++;
console.log("--------------------essai n° ", i);
try {
  throw { nom: "hercule", pays: "grèce antique" }
} catch (error) {
  // Es ist ein Fehler aufgetreten
  console.log("erreur=[", error, "], type=", typeof (error));
}
// Ein „Error“-Typ wurde ausgelöst
i++;
console.log("--------------------essai n° ", i);
try {
  throw new Error("erreur de connexion au réseau");
} catch (error) {
  // Es ist ein Fehler aufgetreten
  console.log("erreur=[", error, "], type=", typeof (error));
}
// Auslösen eines Error-Typs
i++;
console.log("--------------------essai n° ", i);
try {
  throw new Error("erreur de connexion au réseau");
} catch (error) {
  // Es ist ein Fehler aufgetreten – die Meldung befindet sich in [error.message]
  console.log("erreur.message=[", error.message, "], type(error)=", typeof (error));
}

Kommentare

  • Zeilen 35, 44: [Error] ist eine JavaScript-Klasse, deren Konstruktor als ersten optionalen Parameter eine Fehlermeldung akzeptiert. Diese Meldung kann über die Eigenschaft [Error.message] (Zeile 47) abgerufen werden;
  • Es gibt neben [Error] noch weitere Klassen, um einen Fehler zu melden: [EvalError, InternalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError);

Ausführung


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-02.js"
--------------------essai n° 0
erreur=[ msg d'erreur ], type= string
--------------------essai n° 1
erreur=[ [ 1, 2, 3 ] ], type= object
--------------------essai n° 2
erreur=[ { nom: 'hercule', pays: 'grèce antique' } ], type= object
--------------------essai n° 3
erreur=[ Error: erreur de connexion au réseau
at Object.<anonymous> (c:\Data\st-2019\dev\es6\javascript\exceptions\excep-02.js:35:9)
at Object.<anonymous> (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:251206)
at c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:245054
at Generator.next (<anonymous>)
at bl (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:245412)
at kl (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:247659)
at Object.u (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:287740)
at Object.o (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:287137)
at Object.<anonymous> (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:284879)
at Object.apply (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:199341) ], type= object
--------------------essai n° 4
erreur.message=[ erreur de connexion au réseau ], type(error)= object

9.3. Skript [excep-03]

Dieses Skript zeigt, dass man in einem [catch] den Typ der Instanz [Error] unterscheiden kann, die vom [catch] abgefangen wurde:


'use strict';

// Paket „moment“
import moment from 'moment';

// Die empfangene Error-Instanz in ein [catch] umwandeln
for (let i = 0; i < 10; i++) {
  // Datum und Uhrzeit des aktuellen Zeitpunkts
  const now = Date.now();
  // Formatierung der Uhrzeit, um die Millisekunden zu erhalten
  const time = moment(now).format("HH:mm:ss:SSS");
  // die Millisekunden
  const milli = Number(time.substr(time.length - 3));
  console.log("--------------------itération n° ", i);
  try {
    // Anzahl [0, 1, 2]
    const nbre = milli % 3;
    switch (nbre) {
      case 0:
        throw new ReferenceError("erreur 1");
      case 1:
        throw new RangeError("erreur 2");
      default:
        throw new EvalError("erreur 3");
    }
  } catch (error) {
    // Es ist ein Fehler aufgetreten
    if (error instanceof ReferenceError) {
      console.log("ReferenceError :", error.message);
    } else {
      if (error instanceof RangeError) {
        console.log("RangeError :", error.message);
      }
      else {
        if (error instanceof EvalError) {
          console.log("EvalError :", error.message);
        }
      }
    }
  }
}

Ausführung


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-03.js"
--------------------itération n° 0
ReferenceError : erreur 1
--------------------itération n° 1
RangeError : erreur 2
--------------------itération n° 2
RangeError : erreur 2
--------------------itération n° 3
RangeError : erreur 2
--------------------itération n° 4
RangeError : erreur 2
--------------------itération n° 5
RangeError : erreur 2
--------------------itération n° 6
EvalError : erreur 3
--------------------itération n° 7
EvalError : erreur 3
--------------------itération n° 8
EvalError : erreur 3
--------------------itération n° 9
EvalError : erreur 3