Si ma couche Dao lève des exceptions spécifiques à Dao, leur manipulation dans ma couche service constitue-t-elle une fuite de problèmes? Si oui, dois-je alors rendre les exceptions génériques et indépendantes de toute couche pour y remédier, ou existe-t-il une autre manière?
La même question s'applique à la couche d'interface utilisateur gérant les exceptions levées par la couche de service.
Lorsque nous créons une application en couches, il y a toujours une couche utilisateur et une autre couche utilisée. Dans ce cas, la couche UI -> utilise la couche service -> utilise la couche DAO.
Maintenant, c'est très subjectif et ouvert aux interprétations. Mais l'objectif devrait être un bon degré de découplage. Pour y parvenir, une solution consiste à définir le générique exceptions spécifiques au calque disons PersistentException
, ServiceException
etc. Ces exceptions encapsuleront l'exception spécifique au calque.
Par exemple dites s'il y a une erreur du côté de la base de données (violation de contrainte, etc.), encapsulez cela dans PersistentException et laissez la couche service gérer cela (pour savoir comment transmettre à la couche UI de manière générique)
Maintenant que la intégration entre la couche de service et la couche DAO est contractuelle (basée sur l'interface), la couche DAO est libre de changer l'implémentation en n'importe quoi tant qu'elle obéit au - contrat d'interface. Donc, si vous modifiez l'implémentation qui lève de nouvelles exceptions, ces nouvelles exceptions peuvent être encapsulées dans PersistentException
et La couche Service reste inchangée .
Oui. c'est une bonne idée de créer vos propres exceptions indépendantes pour chaque couche.
Par exemple, si vous utilisez une implémentation DAO particulière, vous devez encapsuler l'exception spécifique à l'implémentation dans votre propre exception générique et la transmettre à Service Layer.
Cependant, vous devez être sensible à la création de votre propre hiérarchie d'exceptions de telle sorte qu'elle ne devrait pas être une surcharge pour le développement d'applications ainsi que sa capacité à maintenir les informations requises dans la couche de service. La plupart du temps, des codes d'erreur personnalisés avec exception générique suffisent.
Quelque chose comme ça peut être utilisé pour simuler une exception spécifique à l'implémentation et être jeté à la couche Service.
class AppDAOException extends Exception {
public final static int _FAIL_TO_INSERT = 1;
public final static int _UPDATE_FAILED = 2;
public final static int _SQL_ERROR = 3;
private int errorCode;
public AppDAOException(int errorCode) {
this.errorCode = errorCode;
}
public getErrorCode() {
return errorCode;
}
}
Lancement de la mise en œuvre de DAO:
try {
//code here
} catch (some.impl.SQLSyntaxException e) {
throw new AppDAOException (AppDAOException._SQL_ERROR );
}
À propos des fuites préoccupantes: vous ne souhaiterez peut-être pas que votre couche de service se soucie de toutes les exceptions, telles que:
} catch(NoRowExistsException e) {
return null;
} finally {
//release resources
}
L'appel doit donc être pris en fonction des besoins de l'application.
Votre couche DAO fuit déjà dans la couche service lorsque vous effectuez des opérations telles que:
userDAO.persist(user);
Les exceptions, faire partie de l'API tout comme l'opération doivent être considérées de la même manière.
try {
userDAO.persist(user);
} catch (DAOException e) {
// looks fine to me
}
Une fuite peut se produire avec des exceptions d'exécution ou lorsque vous relancez des exceptions
try {
userDAO.persist(user);
} catch (SQLException e) {
// sql implementation exposed
}
Mais même cela sonne mieux que les exceptions "indépendantes des calques"
Bonne question..!! La gestion des exceptions au niveau de la couche d'interface utilisateur (par exemple, la couche d'actions si vous utilisez des entretoises) est la bonne approche. La création d'exceptions génériques n'est pas un bon moyen de résoudre ce problème. Chaque couche doit cependant avoir ses exceptions spécifiques comme génériques. par exemple, la couche DAO peut avoir des gestionnaires d'exceptions personnalisés comme DavaSavingException, IOException etc.
L'approche consiste donc à lever l'exception de DAO à la couche de service et à nouveau la jeter à la couche d'interface utilisateur et à l'attraper dans des classes spécifiques à l'interface utilisateur.
Cependant, les choses sont trop diplomatiques en fonction de vos applications/besoins.