Quelques règles de programmation des exceptions et du traitement des erreurs

Le logiciel BaseDeFiches a été développé sur plusieurs années et même si le développeur est unique, il en résulte des pratiques de programmation fluctuantes en fonction des découvertes, des nouvelles théories ou de nouvelles lubies.

Le texte présent est plus un pense-bête pour essayer de fixer une pratique commune. Une des parties les plus pénibles dans la programmation est le traitement des erreurs. Sauf à programmer une interface complexe et lourde qui prend l’utilisateur par la main de bout en bout, la solution la plus pratique pour configurer les applications les plus pointues (par exemple, le balayage et l’exportation des données) est celle de fichiers de configuration où l’administrateur doit respecter une syntaxe particulière. C’est la solution la plus efficace pour offrir une large palette de possibilité : l’administrateur n’a qu’à saisir une lettre particulière pour changer totalement la fonction. C’est ce qui explique d’ailleurs la prospérité de la ligne de commande (l’expression « simple et puissante » fait toujours sourire mais cela décrit souvent une application en ligne effectivement simple quand on sait s’en servir).

Qui dit syntaxe dit erreur de syntaxe. Il faut que le logiciel puisse remonter de la manière la plus précise l’erreur de syntaxe à l’utilisateur pour qu’il puisse faire la correction rapidement. Il faut enfin faire la part entre les erreurs de l’utilisateur et les erreurs de programmation inévitables.

Exceptions existants dans Java :

Exceptions « maisons »

Aux exceptions de Java, ont été rajoutées des exceptions qui étendent RuntimeException et qui ne doivent pas être capturées car elles dénoncent un bogue dans le logiciel, elles ne sont pas non plus documentées ou signalées :

À ces quatre exceptions, se rajoute les quatre suivantes qui sont des extensions de RuntimeException et qui servent à transmettre des exceptions sans avoir à les signaler (et permettre la capture en tout fin de chaîne) :

Enfin il faut signaler BdfStorageException qui est envoyée s’il y a un problème dans le stockage des données.

Analyse du texte

Pour signaler les erreurs au moment de l’analyse d’une chaîne de caractères, on privilégiera trois solutions :

L’envoi d’une instance de IllegalArgumentException est à privilégier lorsque les valeurs sont fixes (par exemple, l’expression sous forme de caractères d’une constante numériques ou les différentes valeurs autorisées d’un paramètre).

L’envoi d’une instance de ParseException est à privilégier pour toutes les chaînes courtes où les causes d’invalidation de la chaîne sont réduites (grosso modo soit la chaîne est correcte, soit elle ne l’est pas, sans possibilité de rattraper le cout). Le problème de l’envoi de ParseException est son peu de détail sur les causes.

L’utilisation d’une interface spécifique ErrorHandler est à utiliser dans tous les analyses complexes où certaines parties du texte sont correctes et d’autres non, où les causes sont multiples. Les méthodes se présenteront sous la forme suivante :

Object parse(String s, ErrorHandler errorHandler)

La méthode n’envoie pas d’exception. Il y a trois cas de figure :

Cette procédure impose d’implémenter à chaque fois les ErrorHandler. Ceci seront conçu le plus fin possible afin de signaler les erreurs exactes, à l’appelant de décider ce qu’il en fait (il peut utiliser un système de log, envoyer une exception, etc.).

À éviter (et corriger quand c’est fait) : l’utilisation des Logs qui ne sont pas assez fin pour rapporter les problèmes