Шаблон обработки исключений для этого типа ситуации? - PullRequest
2 голосов
/ 12 июня 2009

У меня есть 2 API от 2 разных компаний, которые позволяют мне общаться с их серверами для обработки транзакций. Мне поручено создать общий интерфейс для этих API. Я придумал что-то вроде этого:

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

В CompanyAServiceProvider Я использую API, который они предлагают для взаимодействия с их удаленными серверами. Этот API от компании A генерирует исключения, которые полностью отличаются от компании B.

Я могу обработать исключение локально, но я не думаю, что это соответствует ситуации.

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

Или я могу выдать это исключение вызывающей стороне:

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

И пусть вызывающая сторона обрабатывает только Exception независимо от того, что это исключение и какой API его выдает.

Как я могу написать интерфейс для двух разных API и сохранить его универсальным, когда я имею дело с двумя разными наборами исключений. Я правильно с этим справляюсь? Какой будет лучший выбор?

Ответы [ 3 ]

14 голосов
/ 12 июня 2009

В этом случае я создаю свой собственный подкласс Exception и просто оборачиваю фактическое исключение. Мой API тогда выставляет только мое исключение.

3 голосов
/ 12 июня 2009

Подумайте о том, с каким уровнем абстракции вы имеете дело на уровне вызывающих функций. Предположительно, вы не хотите раскрывать информацию об отдельных компаниях, с которыми вы имеете дело, и предпочитаете иметь дело с более общими понятиями, такими как «Заказы», ​​«Операции с покупками» и т. Д. Так что совет предыдущего автора хорош: создайте класс наподобие PurchaseException, который является оболочкой для информации, которую вы получили от отдельных классов исключений поставщика.

1 голос
/ 12 июня 2009

Еще одна причина, чтобы обрабатывать Exception локально и бросать свою собственную, чтобы бросить вниз по течению (при необходимости):

Может потребоваться выполнение работы (очистка, повторная попытка и т. Д.), Когда выбрасывается определенный тип Exception, который варьируется от поставщика к поставщику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...