Quoi de plus agaçant pour un utilisateur que de voir son application disparaître brusquement ou de voir apparaître un message totalement incompréhensible annonçant la fin imprévue du programme (ou un message du style "une erreur est survenue"!).
Le traitement des incidents est quelque chose à soigner tout particulièrement dès le début de la réalisation d’un code (ne serait-ce parce que ça va vous aider pendant la phase de mise au point!).
Plusieurs points à garder à l’esprit:
Il existe deux grandes catégories d’erreurs:
Produit
mais le stock est épuisé; un utilisateur saisit un numéro de compte erroné, etc….
Pour émettre des diagnostics pertinents on doit:
disposer de moyen de distinguer les données de diagnostic des types de retour des formes fonctionnelles. En effet une fonction renvoie un résultat, le fait de lui faire envoyer aussi un diagnostic d’erreur:
Une fois qu’on dispose d’un diagnostic le code appelant peut prendre des mesures appropriées et éventuellement émettre un "rapport" destiné à l’extérieur. A "l’extérieur" on doit considérer trois paramètres importants lorsqu’on veut traiter un rapport:
En utilisant l’interface graphique de l’utilisateur? la console de l’administrateur? en envoyant un courriel à la maintenance?
En fait le code réalisant ne se pose pas ces questions: il émet un "rapport interne". Le code appelant prendra les mesures appropriées et émettra le "rapport externe". C’est au reste de l’application (et, éventuellement, à la configuration) de savoir remettre ces rapports externes.
On a donc deux notions importantes distinctes: le rapport "interne" (souvent rendu par la notion d'exception) et le rapport "externe" qui relève du logging.
On notera que la notion de "rapport externe" (logging) englobe les rapports d’erreur, les traces, la journalisation …
Dans un langage comme Java les "rapports internes" sont des données définies comme étant
des Exceptions
, les "rapports externes" sont des LogRecord
, les gestionnaires de rapports savent mettre en forme et remettre les rapports "externes".
En Europe les langages (naturels!) diffèrent, les règles de taxation diffèrent, etc… Une application qui veut dépasser les frontières doit être configurable. En fait elle doit l'être dans tous les cas! Par exemple on peut vouloir une adaptation à un client particulier ou une adaptation à l'évolution des règles de gestion.
Ces adaptations peuvent être constituées de données (les messages traduits, les taux de TVA, l’image de la société courante,…) mais aussi parfois de codes (certaines données ne peuvent être configurées que par programme).
Il est important que le programmeur connaisse bien les stratégies de ressources implantées dans son langage. Il peut y avoir différentes techniques (les ressources d’internationalisation suivent souvent des stratégies spécifiques).
Une question lancinante est où se trouvent ces ressources?
Si c’est dans le système de fichier penser à la portabilité des codes: envisageriez vous de dire "sous WIN* voir à tel endroit, sous UNIX à tel endroit et sous MAC à tel endroit"? C’est à l’application se savoir où trouver systématiquement ses données et le programmeur de déploiement doit avoir une stratégie unique (si possible indépendante des systèmes d’exploitation). De plus penser que certaines ressources peuvent ne pas se trouver sur la machine courante mais sur un serveur, sur le WEB, etc…