@UltimateOrb

Считается ли хорошим подходом создавать исключения в Java?

Есть функция, которая обрабатывает штрих-коды коробок. В ходе ее выполнения происходит множество различных проверок, например: была ли коробка уже отсканирована, если ли коробка на складе и т.д. Если вдруг не проходит любая из проверок, нужно выкидывать сообщение c ошибкой. Вопрос в том, как правильно выкидывать такие сообщения. Варианта два (примерный код):

1. Через исключения

// callback от сканера
public void callbackScaner(String data) {
  try {
     scanBarcode(String barcode);
   } catch (Exeprion e) {
      showMsg(e.getMessage());
   }
}

// обработка бар-кода
public void scanBarcode(String barcode) throws Exception {
   Box box= getProd(barcode);
   if (box== null) throw new Exeption("Коробки нет на складе");
   if (box.ready) throw new Exeption("Коробка уже отсканирована");
   ...   
}


2. Через проверку

// callback от сканера
public void callbackScaner(String data) {
     scanBarcode(String barcode);
}

// обработка бар-кода
public void scanBarcode(String barcode) throws Exception {
   Box box= getProd(barcode);
   if (box== null) {
      showMsg("Коробки нет на складе");
      return;
   }
   if (box.ready) {
      showMsg("Коробка уже отсканирована");
      return;
   }
   ...   
}


Честно говоря мне нравится первый подход. Код более лаконичный. Знаю что плохо закладывать логику в блок catch {}, но здесь ее вроде бы и нет. Судя по другим отзывам, блок try {} не оказывает влияние на производительность, если не происходит исключений.

Ваше мнение?
  • Вопрос задан
  • 523 просмотра
Пригласить эксперта
Ответы на вопрос 4
@aol-nnov
иди дальше!
throw new BoxNotFoundException
throw BoxAlreadyScannedException

:)
Ответ написан
@mitekgrishkin
Как вам самому удобно. Единственное - просто кидать Exception - это издевательство над тем, кто будет это дело сопровождать. В вашем случае можно создать что-то типа UserException - это позволит отличать ваши исключения от общих остальных. Заодно подключите вывод сообщения.
Ответ написан
Комментировать
@sirs

if (box== null) throw new Exeption("Коробки нет на складе");
if (box.ready) throw new Exeption("Коробка уже отсканирована");

Куча if не есть хорошо. Почему бы вам просто не ввести понятие State, создать под него Enum со всеми возможными состояниями и применить шаблон, например, Strategy . Под каждое конкретное состояние объекта нужно будет написать отдельный обработчик и из метода кидать не Exception, а просто передавать управление в нужный обработчик.

Как альтернативный вариант - посмотрите фреймворки, который позволяют организовать т.н. Route, может быть вам понравится такая реализация. Если коробка есть на складе - пройти по пути 1, если коробки нет на складе - пройти по пути 2, если с коробки уже считан код - пройти по роуту 3 и т.д. Такая реализация, например, поможет наладить транзакционность из коробки.
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Нет, кидать исключения - однозначно плохой вариант. Само слово "исключение" говорит об этом - ситуации в приложении должны быть не нормой, а исключением для броска исключения. Исходите из этого постулата.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы