Бросать и ловить исключение в том же методе в Java - PullRequest
0 голосов
/ 11 декабря 2018

Наш сервис вызывает API, который извлекает данные из базы данных.Давайте определим это такне найдено.Итак, мой код: -

try{
    List<RowData> list = getData(id);
} catch (FinderException e) {
     throw new InternalException();
}
return list;

Теперь я понял, что API не выдает исключение FinderException, когда данные не найдены.Следовательно, код моего клиента не работает.Потому что клиенты нашего API ожидали, что InternalException будет выброшено, когда данные не найдены.Теперь их код

list.get(0)

взломан.Теперь я подумываю об изменении кода на: -

try{
    List<RowData> list = getData();
    if(list.isEmpty()) throw new FinderException()
} catch (FinderException e) {
     throw new InternalException();
}
return list;

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

1 Ответ

0 голосов
/ 12 декабря 2018

Вы должны обрабатывать оба случая отдельно:

  1. Исключение Finder вашего API (которое вызывается по любой причине, возможно, если базовая служба недоступна или что-то в этом роде).
  2. Нет элементовнайдено (я предлагаю вам создать собственное (внутреннее) NoItemsFoundException или что-то подобное)

``

List<RowData> list;
try {
    list = getData();
    if(list.isEmpty()) throw new NoItemsFoundException(); 
 // handle this elsewhere, maybe the same place you handle InternalException
} catch (FinderException e) {
    throw new InternalException(e.getMessage());
}
return list;

Хорошей практикой является передача сообщения перехваченного исключения FinderExceptionперезапускает InternalException, поэтому информация не теряется.

...