Les erreurs sont utiles pour signaler que quelque chose ne va pas ou est inattendu dans un programme ou dans un bout de code.
Ce sont des objets JavaScript.
La propriété principale de cet objet est message :
const error = new Error('Oops, something went wrong');
console.log(error.message);
// => "Oops, something went wrong"
Avec la syntaxe throw, on peut lever une erreur.
throw new Error('Oops');
Quand une erreur est levée, l'exécution en cours s'arrête et reprend dans le premier bloc catch de la pile d'appels.
try {
throw new Error('Oops');
} catch (error) {
console.log(error.message);
// => "Oops"
}
L'héritage est une façon de créer des relations parent-enfant entre les classes. La classe enfant (parfois appelée sous-classe) a accès au comportement et aux données définis par la classe parente (parfois appelée 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.
Le mot-clé extends dans la déclaration de la classe enfant établit une relation avec la classe parente via la chaîne de prototypes.
Les objets créés par le constructeur de la classe enfant ont le prototype de la classe parente dans leur chaîne de prototypes, ce qui donne accès à toutes les méthodes ou données définies par la parente.
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
Comme pour toute classe en JavaScript, les sous-classes peuvent hériter de Error pour créer des erreurs personnalisées en utilisant le mot-clé extends.
La syntaxe instanceof permet de vérifier si l'erreur interceptée est une instance d'une sous-classe particulière de 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 est la nouvelle responsable qualité d'une usine de journaux. Comme elle vient d'arriver dans l'entreprise, elle a décidé de passer en revue certains processus de l'usine pour voir ce qui pourrait être amélioré. Elle a découvert que les techniciens effectuent un grand nombre de contrôles qualité à la main. Elle y voit une bonne occasion d'automatiser certaines choses et te demande, à toi qui es développeur freelance, de concevoir un logiciel pour surveiller certaines des machines.
Ta première mission est d'écrire un logiciel pour surveiller le taux d'humidité de la salle de production. Un capteur est déjà connecté au logiciel de l'entreprise et renvoie régulièrement le pourcentage d'humidité de la salle.
Tu dois implémenter une fonction dans le logiciel qui lèvera une erreur si le pourcentage d'humidité est trop élevé.
La fonction devra s'appeler checkHumidityLevel et prendre le pourcentage d'humidité en paramètre.
Tu dois lever une erreur (le message n'a pas d'importance) si le pourcentage dépasse 70 %.
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
Elena est très satisfaite de ta première mission et te demande de t'occuper de la surveillance de la température des machines. Alors que tu discutes avec un technicien, Greg, tu apprends que si la température d'une machine dépasse 500 °C, les techniciens commencent à s'inquiéter d'une surchauffe.
La machine est équipée d'un capteur qui mesure sa température interne. Tu dois savoir que ce capteur est très sensible et tombe souvent en panne. Dans ce cas, les techniciens devront le remplacer.
Ton travail consiste à implémenter une fonction reportOverheating qui prend la température en paramètre et lève une erreur si le capteur est cassé ou si la machine commence à surchauffer.
Sachant que tu devras plus tard réagir différemment selon l'erreur, il te faut un mécanisme pour distinguer les deux types d'erreurs.
Tu pourrais te fier aux messages d'erreur, mais cela rendrait le code fragile, car il casserait si le message venait à être modifié.
Donc, pour pouvoir le faire correctement, tu lèveras des instances de classes d'erreur différentes.
null.
Dans ce cas, tu dois lever une ArgumentError.OverheatingError.
Cette classe d'erreur sera instanciée avec un argument de température.
Assure-toi que l'OverheatingError que tu lèves possède bien une propriété de température.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
Maintenant que ta machine peut détecter les erreurs, tu vas implémenter une fonction qui réagit à ces erreurs de différentes manières :
Implémente une fonction monitorTheMachine qui prend un argument actions.
actions est un objet qui possède 4 propriétés :
| propriété | description |
|---|---|
check |
une fonction. Vérifie la température de la machine. Elle peut lever différentes erreurs. |
alertDeadSensor |
une fonction. Avertit un technicien que le capteur de température est hors service. |
alertOverheating |
une fonction. Allume un voyant d'avertissement sur la machine. |
shutdown |
une fonction. Éteint la machine. |
La fonction monitorTheMachine(actions) doit appeler check() en interne.
Si cet appel réussit, la fonction ne doit rien renvoyer.
Si cet appel fait un throw d'erreur, on attend un comportement différent :
| exception | comportement attendu |
|---|---|
ArgumentError |
appeler la fonction alertDeadSensor. |
OverheatingError |
exécuter le protocole de surchauffe. |
| (tout autre chose) | relancer l'erreur |
Protocole de surchauffe
Si la température est inférieure à 600 °C, allume le voyant d'avertissement en appelant la fonction alertOverheating.
Si la température dépasse 600 °C, la situation est critique, donc appelle la fonction shutdown.
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});
Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.