9. Fehler und Ausnahmen

JavaScript verfügt nicht über ein besonders ausgefeiltes System zur Ausnahmebehandlung. Es bietet jedoch die Anweisung [throw], mit der Sie einen Fehler melden können, sowie die try/catch/finally-Struktur, mit der Sie diese Fehler abfangen können.
9.1. Skript [excep-01]
Im folgenden Skript zeigen wir das aktuelle Datum im Format [Stunden:Minuten:Sekunden:Millisekunden] an. Dazu verwenden wir eine JavaScript-Bibliothek namens [moment.js]. Wir installieren sie wie gewohnt mit dem [npm]-Tool:

Der Skriptcode lautet wie folgt:
'use strict';
// package moment
import moment from 'moment';
...
Um zu verstehen, wie die [import]-Zeile in Zeile 4 geschrieben wird, können wir uns die Definition des [moment]-Moduls ansehen:

- In [1-2] gehen wir zur Moduldefinition;
- in [3] haben wir eine TypeScript-Datei, keine JavaScript-Datei. Zur Laufzeit wird diese TypeScript-Datei in eine JavaScript-Datei kompiliert, bevor sie verwendet wird;
- in [4] suchen wir nach den [export]-Anweisungen (Strg-F);
- in [5] exportiert die Anweisung das [moment]-Objekt. Dies kann in ES6 wie folgt importiert werden:
import moment from 'moment';
Sie können einen beliebigen Namen verwenden, um das [moment]-Objekt zu importieren, zum Beispiel:
import m from 'moment';
Kehren wir zum Skriptcode zurück:
'use strict';
// package moment
import moment from 'moment';
// try / catch / finally principle
for (let i = 0; i < 10; i++) {
// date - current time
const now = Date.now();
// format time to get milliseconds
const time = moment(now).format("HH:mm:ss:SSS");
// milliseconds
const milli = Number(time.substr(time.length - 3));
// display
console.log("--------------------itération n° ", i, "à", time);
try {
// number varies according to time of day
const nbre = milli % 2;
if (nbre === 0) {
// launch an error msg
throw "erreur";
}
// if we've arrived here, there's been no mistake
console.log("pas d'erreur");
} catch (error) {
// if we get here, it's because there's been a mistake
console.log("erreur1=", error);
} finally {
// executed in all cases error or not
console.log("finally")
}
}
Kommentare
- Zeile 4: Importiere die Bibliothek [moment];
- Das Skript durchläuft 10 Schleifen (Zeile 7). Bei jeder Schleifeniteration wird die aktuelle Uhrzeit im Format [Stunden:Minuten:Sekunden:Millisekunden] abgerufen (Zeilen 8–13);
- Wenn die Anzahl der Millisekunden gerade ist, wird eine Fehlermeldung angezeigt (Zeilen 19–22);
- Das Ziel hierbei ist es, zu verstehen, wie try / catch / finally funktioniert
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
Wir sehen, dass die [finally]-Klausel immer ausgeführt wird, unabhängig davon, ob ein Fehler vorliegt oder nicht.
9.2. Skript [excep-02]
Dieses Skript zeigt, dass die [throw]-Anweisung Daten beliebigen Typs auslösen kann und dass diese Daten vollständig von der [catch]-Klausel abgefangen werden.
'use strict';
// you can "throw" just about anything to signal an error
let i = 0;
console.log("--------------------essai n° ", i);
// launch a string
try {
throw "msg d'erreur";
} catch (error) {
// there has been a mistake
console.log("erreur=[", error, "], type=", typeof (error));
}
// launch a table
i++;
console.log("--------------------essai n° ", i);
try {
throw [1, 2, 3]
} catch (error) {
// there has been a mistake
console.log("erreur=[", error, "], type=", typeof (error));
}
// launch a literal object
i++;
console.log("--------------------essai n° ", i);
try {
throw { nom: "hercule", pays: "grèce antique" }
} catch (error) {
// there has been a mistake
console.log("erreur=[", error, "], type=", typeof (error));
}
// lancer un type Error
i++;
console.log("--------------------essai n° ", i);
try {
throw new Error("erreur de connexion au réseau");
} catch (error) {
// there has been a mistake
console.log("erreur=[", error, "], type=", typeof (error));
}
// lancer un type Error
i++;
console.log("--------------------essai n° ", i);
try {
throw new Error("erreur de connexion au réseau");
} catch (error) {
// there has been an error - the message is in [error.message]
console.log("erreur.message=[", error.message, "], type(error)=", typeof (error));
}
Kommentare
- Zeilen 35, 44: [Error] ist eine JavaScript-Klasse, deren Konstruktor eine Fehlermeldung als optionalen ersten Parameter akzeptiert. Diese Meldung kann über die Eigenschaft [Error.message] (Zeile 47) abgerufen werden;
- Neben [Error] gibt es weitere Klassen, die einen Fehler melden können: [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 innerhalb eines [catch] den Typ der von [catch] abgefangenen [Error]-Instanz unterscheiden kann:
'use strict';
// package moment
import moment from 'moment';
// differentiate the Error instance received in a [catch]
for (let i = 0; i < 10; i++) {
// date - current time
const now = Date.now();
// format time to get milliseconds
const time = moment(now).format("HH:mm:ss:SSS");
// milliseconds
const milli = Number(time.substr(time.length - 3));
console.log("--------------------itération n° ", i);
try {
// nbre [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) {
// there has been a mistake
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