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.
Appel réseau :
try{call_network()}catch(error){print_retry_later_message()}finally{log()}
Calcul d'une moyenne :
"use strict";constx=15;letaverage;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 bloccatch puis lefinally.
Si on corrige la division, on constate qu'on ne passe plus dans le bloccatch, mais toujours dans lefinally (même si les blocs qui le précèdent contiennent unreturn).
Il est aussi possible de provoquer soi-même des exceptions pour interrompre une exécution.
Calcul d'une moyenne :
"use strict";constx=15;letaverage;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 renvoieInfinity. On la provoque donc explicitement ensuite.
Calcul d'un âge :
"use strict";constanswer=prompt("How old are you?");constage=Number(answer);if(isNaN(age)){throwanswer+" cannot be converted to a number.";}alert("Next year you will be "+(age+1));