Лучшие практики генерирования исключений на 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 происходит обработка параметров)?
  • Вопрос задан
  • 821 просмотр
Пригласить эксперта
Ответы на вопрос 2
2ord
@2ord
По поводу исключений подробно описано в 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 возвращает хеш, нет ничего плохого в том, чтобы передавать в метод модели хеш. Только нужно добавить дополнительную проверку для данных, так как они передаются от пользователя.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы