Comme d'autres l'ont mentionné plus haut, si vous ne lancez pas d'objet d'erreur, vous devez avoir des blocs try/catch pour capturer ces objets et les traiter de manière appropriée, sinon vous risquez de vous retrouver dans une situation très difficile pour le débogage.
Cependant, lorsqu'il s'agit de lancer des erreurs à des fins autres que la gestion des erreurs, comme le contrôle du déroulement du programme, cela peut être une façon utile d'utiliser le système throw
sans erreur.
L'utilisation de lancers pour contrôler le flux du programme peut s'avérer inefficace dans n'importe quel langage, car le moteur d'exécution doit souvent faire beaucoup d'efforts pour dérouler les informations de la pile d'appels et sérialiser les données afin qu'elles soient disponibles pour l'utilisateur. En évitant la création d'erreurs, vous pouvez éviter ce problème de performance. La clé est que vous devez avoir un gestionnaire en haut de la pile d'appel qui sait comment gérer cette situation. Par exemple, si vous throw {isHardStop: true, stopCode: SOME_CODE}
et concevez les gestionnaires pour qu'ils le détectent, vous pourrez peut-être aplatir une partie de votre code ou choisir une syntaxe plus propre.
Votre gestionnaire pour ce cas d'échelle pourrait être structuré comme suit :
try { ... } catch(thr) {
if(!thr){
// Is not Error or Json - Handle accordingly
} else if(thr.isHardStop){
// Handle the stop
} else {
// Most likely a real error. Handle accordingly
}
}