9. Fouten en uitzonderingen

JavaScript heeft geen erg geavanceerd uitzonderingssysteem. Het biedt echter wel de instructie [throw] waarmee een fout kan worden gemeld, evenals de try/catch/finally-structuur waarmee deze fouten kunnen worden opgevangen.
9.1. script [excep-01]
In het volgende script gaan we de huidige datum weergeven in de vorm [heures:minutes:secondes:millisecondes]. Hiervoor gebruiken we een bibliotheek jS met de naam [moment.js]. We installeren deze, zoals gewoonlijk, met de tool [npm]:

De scriptcode is als volgt:
'use strict';
// pakket moment
import moment from 'moment';
...
Om te weten hoe de regel [import] op regel 4 geschreven moet worden, kun je de definitie van de module [moment] bekijken:

- in [1-2] gaan we naar de definitie van de module;
- bij [3] hebben we een Typescript-bestand, geen JavaScript. Tijdens de uitvoering wordt dit Typescript-bestand gecompileerd naar een JavaScript-bestand voordat het wordt gebruikt;
- in [4] zoeken we naar de instructies [export] (Ctrl-F);
- in [5] exporteert de instructie het object [moment]. Dit kan als volgt worden geïmporteerd in ES6:
import moment from 'moment';
Je kunt elke gewenste naam gebruiken om het object [moment] te importeren, bijvoorbeeld:
import m from 'moment';
Laten we teruggaan naar de scriptcode:
'use strict';
// pakket moment
import moment from 'moment';
// het principe van try / catch / finally
for (let i = 0; i < 10; i++) {
// datum en tijd van het huidige moment
const now = Date.now();
// tijdnotatie om de milliseconden weer te geven
const time = moment(now).format("HH:mm:ss:SSS");
// de milliseconden
const milli = Number(time.substr(time.length - 3));
// weergave
console.log("--------------------itération n° ", i, "à", time);
try {
// aantal variërend afhankelijk van de huidige tijd
const nbre = milli % 2;
if (nbre === 0) {
// een foutmelding weergeven
throw "erreur";
}
// als je hier terechtkomt, is er geen fout opgetreden
console.log("pas d'erreur");
} catch (error) {
// als je hier terechtkomt, is er een fout opgetreden
console.log("erreur1=", error);
} finally {
// wordt in alle gevallen uitgevoerd, of er nu een fout is of niet
console.log("finally")
}
}
Opmerkingen
- regel 4: import van de bibliotheek [moment];
- het principe van het script is om 10 keer een lus te doorlopen (regel 7). Bij elke lus wordt de huidige tijd opgehaald in de vorm [heures:minutes:secondes:millisecondes] (regels 8-13);
- als het aantal milliseconden even is, wordt er een foutmelding weergegeven (regels 19-22);
- het gaat hier om het begrijpen van de werking van try / catch / finally
Uitvoering
[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
We zien dat de clausule [finally] altijd wordt uitgevoerd, ongeacht of er een fout optreedt of niet.
9.2. script [excep-02]
Dit script, dat door de instructie [throw] kan worden gestart, kan elk type gegevens verwerken en deze gegevens worden volledig opgehaald door de clausule [catch].
''use strict';
// je kunt vrijwel alles ‘throwen’ om een fout te melden
let i = 0;
console.log("--------------------essai n° ", i);
// een tekenreeks 'throwen'
try {
throw "msg d'erreur";
} catch (error) {
// er is een fout opgetreden
console.log("erreur=[", error, "], type=", typeof (error));
}
// een tabel genereren
i++;
console.log("--------------------essai n° ", i);
try {
throw [1, 2, 3]
} catch (error) {
// er is een fout opgetreden
console.log("erreur=[", error, "], type=", typeof (error));
}
// een letterlijk object starten
i++;
console.log("--------------------essai n° ", i);
try {
throw { nom: "hercule", pays: "grèce antique" }
} catch (error) {
// er is een fout opgetreden
console.log("erreur=[", error, "], type=", typeof (error));
}
// een Error-type aanroepen
i++;
console.log("--------------------essai n° ", i);
try {
throw new Error("erreur de connexion au réseau");
} catch (error) {
// er is een fout opgetreden
console.log("erreur=[", error, "], type=", typeof (error));
}
// een Error-type genereren
i++;
console.log("--------------------essai n° ", i);
try {
throw new Error("erreur de connexion au réseau");
} catch (error) {
// er is een fout opgetreden - het bericht staat in [error.message]
console.log("erreur.message=[", error.message, "], type(error)=", typeof (error));
}
Opmerkingen
- regels 35, 44: [Error] is een JavaScript-klasse waarvan de constructor als eerste optionele parameter een foutmelding accepteert. Deze melding kan worden opgehaald via de eigenschap [Error.message] (regel 47);
- er zijn naast [Error] nog andere klassen om een fout te melden: [EvalError, InternalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError);
Uitvoering
[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. script [excep-03]
Dit script laat zien dat men in een [catch] onderscheid kan maken tussen het type instantie [Error] dat door de [catch] wordt onderschept:
''use strict';
// pakket moment
import moment from 'moment';
// de ontvangen Error-instantie differentiëren in een [catch]
for (let i = 0; i < 10; i++) {
// datum en tijd van het huidige moment
const now = Date.now();
// tijd opmaken om de milliseconden te verkrijgen
const time = moment(now).format("HH:mm:ss:SSS");
// de milliseconden
const milli = Number(time.substr(time.length - 3));
console.log("--------------------itération n° ", i);
try {
// aantal [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) {
// er is een fout opgetreden
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);
}
}
}
}
}
Uitvoering
[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