2009-06-12 7 views
2

J'ai 2 API de 2 sociétés différentes qui me permettent de communiquer avec leurs serveurs afin de traiter des transactions. Je suis chargé de créer une interface générique pour ces API. Je suis venu avec quelque chose comme ceci:Modèle de gestion des exceptions pour ce type de situation?

IServiceProvider <- ServiceProvider <- CompanyAServiceProvider 
IServiceProvider <- ServiceProvider <- CompanyBServiceProvider 

En CompanyAServiceProvider J'utilise l'API qu'ils offrent à l'interface avec leurs serveurs distants. Cette API de la société A génère des exceptions totalement différentes de celles de la société B.

Je peux gérer l'exception localement mais je ne pense pas vraiment que la situation se corrode.

public String purchase(String amount) { 
    try { 
    request = new Request(RequestIF.NEW_ORDER_TRANSACTION); 
    } catch (InitializationException e) { 
    //do something. 
    } 
} 

Ou je peux jeter cette exception à l'appelant:

public String purchase(String amount) throws Exception { 
    request = new Request(RequestIF.NEW_ORDER_TRANSACTION); 
} 

Et que l'appelant poignée juste le Exception, peu importe ce que cette exception est et peu importe ce que l'API jette.

Comment puis-je écrire une interface pour 2 API différentes et la garder générique quand j'ai affaire à 2 ensembles différents d'exceptions levées. Est-ce que je m'occupe de cela correctement? Quel serait le meilleur choix?

Répondre

14

Dans ce cas, je crée ma propre sous-classe Exception et j'enveloppe l'exception réelle. Mon API expose ensuite uniquement mon exception. Réfléchissez au niveau d'abstraction dont vous êtes confronté au niveau des fonctions d'appel.

+1

Oui, créez votre propre sous-classe Exception. Assurez-vous de prendre en charge le constructeur Exception qui prend une exception en tant que paramètre. Votre API peut créer des exceptions nommées pour donner un sens aux utilisateurs de cette API, et vous pouvez intégrer de manière appropriée les exceptions provenant des API tierces que vous utilisez. C'est la meilleure pratique. – Eddie

+0

Que se passe-t-il si, au cours de l'achat metho, plusieurs exceptions différentes peuvent être générées par l'API de la société A? Est-ce que j'enveloppe chacun avec une classe d'exception différente que je crée? –

+2

Si vous souhaitez fournir la sémantique de l'exception d'origine, vous pouvez créer plusieurs classes d'exception basées sur votre exception personnalisée d'origine: MyException, Failure1Exception étend MyException, etc. Vous pouvez ensuite déclarer MyException sur la méthode ou l'afficher Failure1Exception, Failure2Exception etc. – akarnokd

3

Vraisemblablement, vous ne voulez pas exposer les détails des entreprises individuelles avec lesquelles vous traitez, et préféreriez traiter des concepts plus génériques comme les commandes, les transactions d'achat etc. Donc le conseil de l'affiche précédente est bon: créer une classe comme PurchaseException, qui est un wrapper autour des informations que vous avez récupérées des classes d'exceptions individuelles du fournisseur.

1

Une autre raison de traiter le Exception localement et rouler votre propre à jeter en aval (si nécessaire):

Il pourrait y avoir un travail qui doit être effectué (nettoyage, nouvelle tentative, etc.) quand un type spécifique de Exception est lancé qui varie d'un fournisseur à l'autre.

Questions connexes