Imaginez que j'ai un service qui ressemble à ceci:Comment gérer les erreurs d'une méthode de façade qui effectue de nombreuses modifications de fond disparates?
public interface MyAccountService
{
boolean create(String user);
}
La méthode crée effectue plusieurs changements, à savoir (pour l'amour de discussion):
- ajoute un message dans une file d'attente
- ajoute une ligne dans plusieurs tables
- crée un compte LDAP, etc ...
Actuellement, je réduis tous les messages d'erreur en une seule valeur de retour booléenne. Maintenant, en interne s'il y a une erreur, je vais les enregistrer pour l'équipe de support.
par exemple. un journal typique d'une création d'utilisateur a échoué
création de compte "alistair" dans l'ordre suivant (stricte):
- ajouter à la table Foo: succès
- ajouter à la table Bar: succès
- ajouter à LDAP: a échoué
- ajouter à la file d'attente: succès
de cette façon, les gens du support technique peuvent décider comment réparer la Accou NT.
Quelle est la meilleure pratique pour concevoir des systèmes tels que nous pouvons facilement suivre le succès/échec d'une transaction (et le réparer manuellement)? Retourne booléen & Avaler toutes les exceptions un bon design?
EDIT: Par exceptions déglutition, je voulais dire ne pas les jeter le l'appelant. Cependant, je consigner les exceptions et les traduire en une valeur de retour false/true.
L'option 1 est une option raisonnable. Dois-je essayer d'exécuter toutes les 4 opérations de manière non transactionnelle? Signification: si je rencontre un problème d'insertion dans la table Foo, je me souviens de l'erreur et continue à toutes les autres tâches. Ou devrais-je court-circuiter et abandonner? Notez qu'à l'exception de l'opération de file d'attente, toutes les tâches sont idempotentes car les tables de base de données et le serveur LDAP n'accepteront pas les entrées en double. –
Cela dépend de votre application. Si vous avez besoin de toutes les tâches à effectuer dans une transaction, vous devez annuler toutes les modifications apportées aux sous-systèmes en cas d'erreur. Dans ce scénario, faites simplement une annulation et lancez Exception avec le problème. D'un autre côté, si c'est juste juste pour mettre à jour la base de données et LDAP et indiquer au client que l'appel JMS a échoué, n'exécutez pas de transactions, souvenez-vous simplement de chaque erreur et notifiez l'utilisateur via Exception. –