Code du jour: Exceptio probat regulam

Publié le 23 juin 2008 par Wtf

Si on me demandait de choisir la partie du développement logiciel qui a le meilleur potentiel pour les monstruosités, je répondrais sans hésiter : les exceptions. Un Jeune prestataire qui souhaite rester anonyme nous envoie le code d'une exception trouvée dans un projet J2EE.


Bien qu'étant une exception, la classe FinNormaleDeServletException n'est pas utilisée pour signaler un traitement sortant du cadre normal prévu par une fonction. Et contrairement à ce son nom pourrait laisser entendre, elle n'indique pas non plus que le traitement du service utilisé par la servlet s'est bien passé, enfin... pas toujours.

Ainsi, cette classe est utilisée parfois pour interrompre le traitement d'une servlet ...

               if(StringHelper.isNullOrEmpty(pRequest.getParameter("FRA_COD"))) {
// FRA_COD n'est pas valide
sendRedirect(ServletURLs.NF_A, pResponse);
throw new FinNormaleDeServletException("NOFRACOD");
}

... parfois pour simplement sortir (avec un arrêt  au catch très utile...) de la fonction :

                       // On lance une FinNormaleDeServletException pour indiquer que tout s'est bien passé
throw new FinNormaleDeServletException();
} catch(FinNormaleDeServletException e) {
throw e;
}

Ce qui à l'utilisation donne de très jolis spécimens comme celui ci :

               } catch (FinNormaleDeServletException ex) {
// Pas de traitement
}

Le "développeur" à l'origine de cette chose n'est plus dans la société. Évidement personne ne veut y toucher : du moment que ça compile, pourquoi s'embêter à tout changer?

Vous remarquerez que le nom de la classe montre la confiance en soi que devait avoir le développeur. Pour lui, une fin de traitement normale, serait une exception ...