Лучшие практики генерирования исключений на ruby?

Добрый день, созрел такой общий (можно сказать философский) вопрос по поводу исключений на ruby и rails.
В сети очень много всего про то как их обрабатывать и отлавливать, а вот когда их генерировать нет (или я не так ищу).
Понятно, что исключения нужно генерировать когда имеет место исключительная ситуация, логику на исключениях завязывать не нужно, это понятно.

Вопрос к общественности какие ситуации вы считаете исключительными? Ссылки на github лучшего кода? Хотелось бы побольше проектов на ruby on rails.

Допустим:
Проект RoR: пользователь может указать несколько компаний с которыми он работает, через форму передается params.require(:user).permit(:email, ..., company_ids: []) т.е. {"email": "mail@asd.com", ... ,"company_ids": ["12", "23", "123"]}
В модели User есть метод:

def update_with_companies params_with_companies
...
end

Я исхожу из того что, ситуация когда пользователь пытается добавить несуществующие компании (их нет в списке компаний в форме), или дублирует компанию (хотя js в форме этого сделать не позволяет, т.е. пользователь шлет например curl запрос), или еще что то нештатное это все исключительная ситуация и метод update_with_companies будет генерировать исключение. если все ок просто вернет экземпляр класса User. Кстати что вы думаете по поводу передачи params_with_companies которое по сути params из контроллера в модель? Нужно ли передавать эти же параметры в другом в виде в модель предварительно обработав их в контроллере (дело в том что компании конкретного пользователя связаны с моделью User через ассоциации и внутри метода update_with_companies происходит обработка параметров)?
  • Вопрос задан
  • 813 просмотров
Пригласить эксперта
Ответы на вопрос 2
По поводу исключений подробно описано в Exceptional Ruby. Несмотря на то что опубликовано в начале 2011, всё ещё актуально.
Use exceptions only for exceptional situations.

Invalid user input isn't unusual


При обработке неверного запроса от HTTP клиента нужно вернуть ответ HTTP .
REST response code for invalid data
Любые ответы HTTP 40x говорят о том, что HTTP клиент работает неправильно.

В случае работы в Ruby on Rails исключения считаются, видимо, нормальной практикой и поэтому от них никуда не уйти.
Trying to get a POST to return 400 bad request

При обработке POST запросов следует выдать пользователю сообщение о том где ошибка ("Выберите компании из списка"). Если ошибка в логике JS, то надо исправлять код JS.
Ответ написан
Комментировать
Jeiwan
@Jeiwan
Исключения нужно вызывать с случае ошибок, когда программа дальше работать не может. Но и стоить помнить, что исключения в руби работают медленно, поэтому использовать их лучше реже. А для обработки ошибок использовать обычные условия (if, else, unless ...).

пользователь пытается добавить несуществующие компании

Это проверку нужно вынести в валидацию модели. Сделать свой кастомный метод.

update_with_companies будет генерировать исключение.

Здесь не нужно исключение. Метод update_with_companies должен работать так же, как и стандартный метод save. Возможно, если убрать проверку компаний в валидацию, от метода update_with_companies вообще можно будет отказаться.

Кстати что вы думаете по поводу передачи params_with_companies которое по сути params из контроллера в модель?

params возвращает хеш, нет ничего плохого в том, чтобы передавать в метод модели хеш. Только нужно добавить дополнительную проверку для данных, так как они передаются от пользователя.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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