9. Errori ed eccezioni

JavaScript non dispone di un sistema di eccezioni molto avanzato. Offre tuttavia l’istruzione [throw] che consente di segnalare un errore, nonché la struttura try / catch / finally che permette di intercettare tali errori.
9.1. script [excep-01]
Nello script che segue, visualizzeremo la data corrente nel formato [heures:minutes:secondes:millisecondes]. A tal fine, utilizzeremo una libreria jS denominata [moment.js]. La installiamo, come di consueto, con lo strumento [npm]:

Il codice dello script è il seguente:
'use strict';
// pacchetto moment
import moment from 'moment';
...
Per capire come scrivere la riga [import] della riga 4, si può consultare la definizione del modulo [moment]:

- in [1-2], si passa alla definizione del modulo;
- in [3], si trova un file Typescript, non Javascript. All’esecuzione, questo file Typescript viene compilato in un file Javascript prima di essere utilizzato;
- in [4], si cercano le istruzioni [export] (Ctrl-F);
- in [5], l’istruzione esporta l’oggetto [moment]. Quest’ultimo può essere importato in ES6 nel modo seguente:
import moment from 'moment';
È possibile utilizzare qualsiasi nome per importare l’oggetto [moment], ad esempio:
import m from 'moment';
Torniamo al codice dello script:
'use strict';
// pacchetto moment
import moment from 'moment';
// principio di try / catch / finally
for (let i = 0; i < 10; i++) {
// data e ora del momento corrente
const now = Date.now();
// formattazione dell'ora per ottenere i millisecondi
const time = moment(now).format("HH:mm:ss:SSS");
// i millisecondi
const milli = Number(time.substr(time.length - 3));
// visualizzazione
console.log("--------------------itération n° ", i, "à", time);
try {
// numero variabile a seconda dell'ora corrente
const nbre = milli % 2;
if (nbre === 0) {
// invia un messaggio di errore
throw "erreur";
}
// se si arriva qui, significa che non si è verificato alcun errore
console.log("pas d'erreur");
} catch (error) {
// se si arriva qui, significa che si è verificato un errore
console.log("erreur1=", error);
} finally {
// eseguito in ogni caso, indipendentemente dalla presenza o meno di un errore
console.log("finally")
}
}
Commenti
- riga 4: importazione della libreria [moment];
- il principio dello script consiste nell'eseguire un ciclo di 10 ripetizioni (riga 7). Ad ogni ripetizione del ciclo, viene recuperata l'ora corrente nel formato [heures:minutes:secondes:millisecondes] (righe 8-13);
- se il numero di millisecondi è pari, viene generato un messaggio di errore (righe 19-22);
- in questo caso si tratta di comprendere il funzionamento di try / catch / finally
Esecuzione
[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
Si nota che la clausola [finally] viene sempre eseguita, indipendentemente dal fatto che si verifichi o meno un errore.
9.2. script [excep-02]
Questo script, che l’istruzione [throw] può lanciare con qualsiasi tipo di dato, viene recuperato integralmente dalla clausola [catch].
'use strict';
// si può «lanciare» (throw) praticamente qualsiasi cosa per segnalare un errore
let i = 0;
console.log("--------------------essai n° ", i);
// lanciare una stringa di caratteri
try {
throw "msg d'erreur";
} catch (error) {
// si è verificato un errore
console.log("erreur=[", error, "], type=", typeof (error));
}
// creare una tabella
i++;
console.log("--------------------essai n° ", i);
try {
throw [1, 2, 3]
} catch (error) {
// si è verificato un errore
console.log("erreur=[", error, "], type=", typeof (error));
}
// creare un oggetto letterale
i++;
console.log("--------------------essai n° ", i);
try {
throw { nom: "hercule", pays: "grèce antique" }
} catch (error) {
// si è verificato un errore
console.log("erreur=[", error, "], type=", typeof (error));
}
// generare un tipo Error
i++;
console.log("--------------------essai n° ", i);
try {
throw new Error("erreur de connexion au réseau");
} catch (error) {
// si è verificato un errore
console.log("erreur=[", error, "], type=", typeof (error));
}
// genera un tipo Error
i++;
console.log("--------------------essai n° ", i);
try {
throw new Error("erreur de connexion au réseau");
} catch (error) {
// si è verificato un errore - il messaggio si trova in [error.message]
console.log("erreur.message=[", error.message, "], type(error)=", typeof (error));
}
Commenti
- righe 35, 44: [Error] è una classe JavaScript il cui costruttore accetta come primo parametro facoltativo un messaggio di errore. Questo messaggio può essere recuperato nella proprietà [Error.message] (riga 47);
- esistono altre classi oltre a [Error] per segnalare un errore: [EvalError, InternalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError);
Esecuzione
[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]
Questo script dimostra che, in un [catch], è possibile distinguere il tipo di istanza [Error] intercettata dal [catch]:
'use strict';
// pacchetto moment
import moment from 'moment';
// distinguere l'istanza di Error ricevuta in un [catch]
for (let i = 0; i < 10; i++) {
// data e ora del momento corrente
const now = Date.now();
// formattazione dell'ora per ottenere i millisecondi
const time = moment(now).format("HH:mm:ss:SSS");
// i millisecondi
const milli = Number(time.substr(time.length - 3));
console.log("--------------------itération n° ", i);
try {
// numero [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) {
// si è verificato un errore
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);
}
}
}
}
}
Esecuzione
[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