Gli errori sono utili per segnalare quando qualcosa non va o è inatteso in un programma o in una porzione di codice.
Sono oggetti JavaScript.
La proprietà principale di questo oggetto è message:
const error = new Error('Oops, something went wrong');
console.log(error.message);
// => "Oops, something went wrong"
Con la sintassi throw, puoi lanciare un errore.
throw new Error('Oops');
Quando viene lanciato un errore, l'esecuzione corrente si interrompe e riprende nel primo blocco catch del call stack.
try {
throw new Error('Oops');
} catch (error) {
console.log(error.message);
// => "Oops"
}
L'ereditarietà è un modo per creare relazioni padre-figlio tra le classi. La classe figlia (a volte chiamata sottoclasse) ha accesso al comportamento e ai dati definiti dalla classe genitore (a volte chiamata superclasse).
class Pet {
constructor(name) {
this.name = name;
}
introduce() {
console.log(`This is my pet, ${this.name}.`);
}
}
class Dog extends Pet {}
const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.
La parola chiave extends nella dichiarazione della classe figlia stabilisce una relazione con la classe genitore attraverso la catena di prototipi.
Gli oggetti creati dal costruttore della classe figlia avranno il prototipo della classe genitore nella loro catena di prototipi, il che dà accesso a tutti i metodi o i dati definiti dalla classe genitore.
const dog = new Dog('Otis');
Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true
Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false
Come per qualsiasi classe in JavaScript, le sottoclassi possono ereditare da Error per creare errori personalizzati usando la parola chiave extends.
La sintassi instanceof verifica se l'errore catturato è un'istanza di una particolare sottoclasse di Error.
class CustomError extends Error {}
try {
// ... Code that may throw an error
} catch (error) {
if (error instanceof CustomError) {
console.log('The error thrown is an instance of the CustomError');
}
}
Elena è la nuova responsabile qualità di una fabbrica di giornali. Dato che è appena arrivata in azienda, ha deciso di rivedere alcuni processi della fabbrica per vedere cosa si potrebbe migliorare. Ha scoperto che i tecnici fanno molti controlli di qualità a mano. Vede una buona opportunità di automazione e chiede a te, sviluppatore freelance, di realizzare un software per monitorare alcune delle macchine.
La tua prima missione è scrivere un software per monitorare il livello di umidità della sala di produzione. C'è già un sensore collegato al software dell'azienda che restituisce periodicamente la percentuale di umidità della stanza.
Devi implementare nel software una funzione che lanci un errore se la percentuale di umidità è troppo alta.
La funzione deve chiamarsi checkHumidityLevel e accettare la percentuale di umidità come parametro.
Devi lanciare un errore (il messaggio non è importante) se la percentuale supera il 70%.
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
Elena è molto soddisfatta del tuo primo incarico e ti chiede di occuparti del monitoraggio della temperatura delle macchine. Mentre parli con un tecnico, Greg, scopri che se la temperatura di una macchina supera i 500°C, i tecnici iniziano a preoccuparsi del surriscaldamento.
La macchina è dotata di un sensore che misura la sua temperatura interna. Devi sapere che il sensore è molto sensibile e spesso si rompe. In questo caso, i tecnici dovranno cambiarlo.
Il tuo compito è implementare una funzione reportOverheating che accetta la temperatura come parametro e lancia un errore se il sensore è rotto o se la macchina inizia a surriscaldarsi.
Sapendo che in seguito dovrai reagire in modo diverso a seconda dell'errore, ti serve un meccanismo per distinguere i due tipi di errore.
Potresti affidarti ai messaggi di errore, ma questo renderebbe il codice fragile: si romperebbe se il messaggio venisse aggiornato.
Quindi, per farlo come si deve, lancerai istanze di classi di errore diverse.
null.
In questo caso, devi lanciare un ArgumentError.OverheatingError.
Questa classe di errore verrà istanziata con la temperatura come argomento.
Assicurati che l'OverheatingError che lanci abbia una proprietà temperature associata.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
Ora che la macchina sa rilevare gli errori, implementerai una funzione che reagisce a quegli errori in modi diversi:
Implementa una funzione monitorTheMachine che accetta un argomento actions.
actions è un oggetto che ha 4 proprietà:
| proprietà | descrizione |
|---|---|
check |
una funzione. Controlla la temperatura della macchina. Può lanciare vari errori. |
alertDeadSensor |
una funzione. Avvisa un tecnico che il sensore della temperatura è guasto. |
alertOverheating |
una funzione. Accenderà una spia di allarme sulla macchina. |
shutdown |
una funzione. Spegnerà la macchina. |
La funzione monitorTheMachine(actions) deve chiamare internamente check().
Se il controllo va a buon fine, la funzione non deve restituire nulla.
Se quel throw produce un errore, ci si aspetta un comportamento diverso:
| eccezione | comportamento previsto |
|---|---|
ArgumentError |
chiama la funzione alertDeadSensor. |
OverheatingError |
esegui il protocollo di surriscaldamento. |
| (qualsiasi altra cosa) | rilancia l'errore |
Protocollo di surriscaldamento
Se la temperatura è inferiore a 600 °C, accendi la spia di allarme chiamando la funzione alertOverheating.
Se la temperatura supera i 600 °C, la situazione è critica, quindi chiama la funzione shutdown.
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});
Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.