Je suis en cours de rédaction de certaines règles et normes de développement Java/JEE et plus précisément sur la gestion des exceptions (vérifiées et non-vérifiées) de mes services distants (EJB stateless).

Mes services distants sont dans une architecture applicative standard de type 3-tiers : IHM (présentation et interaction avec l'utilisateur), service distant (contenant la logique métier), et BD (persistance).

Je pensais établir la règle suivante :

"Aucune exception non-vérifiée (RuntimeException, Errors et leurs classes filles) ne doit être lancée par le service métier distant vers son client (IHM).

En effet, une exception non-vérifiée lancée (de façon volontaire ou non) depuis le traitement du service métier signifie qu'un problème bloquant est survenu dans ce service (pas dans l'IHM).

Il n'est donc pas souhaitable de propager cette exception non-vérifiée vers le client (distant) car le traitement de ce dernier sera lui aussi interrompu et se terminera en erreur.

Le service distant doit obliger son client distant a prendre en compte toutes les exceptions possibles qui pourraient survenir dans le service métier distant. Et le service métier doit s'engager a encapsuler dans cette ou ces exceptions tous les problèmes possibles qu'il peut rencontrer durant son traitement.

Le traitement distant doit rendre un service et n'a pas pour vocation de bloquer le traitement IHM (trop dangereux dans une architecture 3-tiers) même si le traitement du service ne peut se terminer avec succès.

Ainsi, le service métier distant devra toujours attraper (catch) l'exception non-vérifiée survenu dans son traitement et la transformer en une exception vérifiée (RemoteServiceException héritant d'Exception par exemple). Tous les problèmes survenus dans le service seront encapsulés dans cette RemoteServiceException vérifiée."


Exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
public void monServiceMetierDistant() throws RemoteServiceException {
try  {
     // traitement métier ; application des regles de calcul et de gestion, etc.
} catch(RuntimeException rte) {
     // un problème technique bloquant (lancé volontairement ou non) est survenu.
     throw new RemoteServiceException("message=un problème bloquant dans le service distant est survenu: "+rte.getMessage(),"code=PXT00012");
   }
}
Que pensez-vous de cette règle ? Est-elle correcte selon vous ?