Je programme actuellement un petit calculateur formel en CaML avec analyseur lexical, syntaxique...
Pour bien faire, j´ai décidé de mettre à profit le système d´exceptions pour signaler les erreurs de syntaxe ou de lexique lors du traitement des chaines.
Ainsi, une fonction d´extraction de valeurs flottantes renverra une exception dans le cas ou l´utilisateur entre plusieures fois le caractère ´.´. De même, la tentative d´extraire une chaine de caractère commencant par ´\"´ mais non terminée par ´\"´ lèvera une exception.
Mon problème réside dans le traitement de ces exceptions : pour que le code reste propre, il faudrait que l´utilisateur ne soit informé d´une erreur que par la fonction se chargeant de faire l´interface entre le programme et l´utilisateur : pas question que mes fonctions internes affichent des messages d´erreur à l´écran : cest le rôle de l´interface.
Le problème, c´est que pour procéder de la sorte, il faut que les fonctions appelants d´autres fonctions succeptibles de lever des exceptions soient en mesure de faire passer à leur tour l´exception ("téléphone arabe").
Mon code se résume à des :
try ... with ExceptionBidule -> raise ExceptionBidule
Afin de faire remonter les exceptions jusqu´à l´interface...
Le probème, c´est que c´est moche, redondant et très lourd sur certaines fonctions...
Comment faire pour conserver la précision de chaque exception (i.e éviter de faire : si on rencontre un exception quelconque, alors on renvoie une Exception générique qui englobe toutes les autres...) tout en évitant cette surcharge.
Un exemple parce que j´ai pas l´impression d´avoir été clair
:
Soit la fonction f qui lève l´exception E
Soit la fonction g qui appelle f
Soit l´interface i qui appelle g et qui utilise la GUI pour afficher les erreurs
Comment faire pour que le code de g ne ressemnle pas à :
try f(...) with E -> raise E ?