Programmation JavaScript/Exceptions et erreurs

Un livre de Wikilivres.

try / catch / finally[modifier | modifier le wikicode]

Pour éviter qu'une erreur interrompe l'exécution du programme, on peut l'attraper et définir des actions à effectuer si elle survient.

Les exceptions les plus courantes sont des ressources introuvables (ex : plus de réseau ou base de données en maintenance) ou des calculs impossibles comme les divisions par zéro.

Exemples[modifier | modifier le wikicode]

Appel réseau :

try {
  call_network()
} catch (error) {
  print_retry_later_message()
} finally {
  log()
}

Calcul d'une moyenne :

"use strict";

const x = 15;
let average;

try {
  x = x + 5;
  average = x / 0;
  alert("The average is: " + average);
} catch (err) {
  alert("Something strange occurs. The error is: " + err);
} finally {
  alert("End of program.");
}

Dans cet exemple, la division par zéro montre que l'exécution est toujours interrompue avant l'affichage de la moyenne, pour passer dans le bloc catch puis le finally.

Si on corrige la division, on constate qu'on ne passe plus dans le bloc catch, mais toujours dans le finally (même si les blocs qui le précèdent contiennent un return).

throw[modifier | modifier le wikicode]

Il est aussi possible de provoquer soi-même des exceptions pour interrompre une exécution.

Exemples[modifier | modifier le wikicode]

Calcul d'une moyenne :

"use strict";

const x = 15;
let average;
try {
  average = x / 0;
  if (average === Infinity || Number.isNaN(average)) {
    throw "Error during division. The result is: " + average;
  }
  alert("The average is: " + average);
} catch (err) {
  alert("Something strange occurs. The error is: " + err);
} finally {
  alert("End of program.");
}

Ici la division par zéro ne provoque pas d'exception, mais renvoie Infinity. On la provoque donc explicitement ensuite.

Calcul d'un âge :

"use strict";

const answer = prompt("How old are you?");
const age = Number(answer);

if (isNaN(age)) {
  throw answer + " cannot be converted to a number.";
}
alert("Next year you will be " + (age + 1));