Malheureusement, j'ai un ancien système PHP4 auquel j'ai continuellement besoin d'ajouter des fonctionnalités. Il ne semble pas qu'il y aura des ressources pour faire un portage vers PHP5 avant plusieurs mois, voire plusieurs années. Au cours des dernières années, l'une des principales choses qui m'a gêné est de ne pas avoir la possibilité de lancer des exceptions proprement. A cause de cela, toutes sortes de codes de vérification d'erreurs doivent constamment interrompre le flux de ce qui se passe.
Venons-en donc à la question : Quelle est la meilleure stratégie que vous ayez vue pour émuler la propreté de la gestion des exceptions dans les langages qui n'ont pas de modèle d'exception ?
Joel a ceci à dire concernant les exceptions, comme indiqué dans une réponse :
http://www.joelonsoftware.com/items/2003/10/13.html
Ils créent trop de points de sortie possibles pour une fonction. Pour écrire un code correct, vous devez vraiment penser à tous les chemins de code possibles à travers votre fonction. Chaque fois que vous appelez une fonction qui peut lever une exception et que vous ne l'attrapez pas sur le champ, vous créez des opportunités de bogues surprises causés par des fonctions qui se terminent brusquement, laissant des données dans un état incohérent, ou d'autres chemins de code auxquels vous n'avez pas pensé.
Une meilleure alternative consiste à faire en sorte que vos fonctions renvoient des valeurs d'erreur lorsque les choses tournent mal, et à traiter ces erreurs de manière explicite, aussi verbeux que cela puisse être. Il est vrai que ce qui devrait être un simple programme de 3 lignes s'épanouit souvent en 48 lignes lorsque vous mettez en place un bon contrôle d'erreur, mais c'est la vie, et la recouvrir d'exceptions ne rend pas votre programme plus robuste. Je pense que la raison pour laquelle les programmeurs des langages de style C/C++/Java ont été attirés par les exceptions est simplement parce que la syntaxe n'a pas de moyen concis d'appeler une fonction qui renvoie plusieurs valeurs, il est donc difficile d'écrire une fonction qui soit produit une valeur de retour, soit renvoie une erreur.
Cependant, un bon modèle d'exception dans un langage fait en sorte que la fonction appelée spécifie qu'elle va en fait lever une exception. Cela implique qu'il y a exactement zéro endroit supplémentaire où la fonction peut sortir (le code renverrait simplement false au lieu de lancer une exception), mais il y a exactement 1 endroit supplémentaire où la fonction peut sortir... Le bloc catch de la fonction appelante. Toute personne peut écrire un code bâclé qui laisse toutes les exceptions remonter vers le haut pour être traitées par d'autres, mais cela ne veut pas dire que vous devrait enlever un outil qui peut être utilisé de manière propre et efficace.
En fait, toute fonction peut renvoyer une valeur qui est hors de portée des valeurs de retour attendues du code appelant. Un bon programmeur va traiter toutes les valeurs de retour possibles, y compris les codes d'erreur et les conditions. Le modèle d'exception lui donne simplement un moyen de le faire proprement.