В настоящее время я участвую в разработке приложения больших рельсов, которое взаимодействует с другим продуктом через собственный API-интерфейс. Это привело к очень странной проблеме улавливания ошибок. Например, когда мы взаимодействуем с другим продуктом, он может вернуть ошибку аутентификации, которую мы ожидаем. Затем мы улавливаем эту ошибку в нашем API-графе и генерируем исключение, которое затем захватывается и ретранслируется пользователю в представлении.Где и как обращаться с рельсами?
мне не нравится этот способ ловли ошибки по нескольким причинам: Это не похоже
- как мы должны ожидать исключений и использовать их в нашей логике. Например, иногда мы хотим переписать объект - поэтому мы поймаем исключение «объект уже существует» и продолжаем и сохраняем нашу модель в любом случае.
- Для этого требуется много особых ошибок. В коде есть несколько областей, где мы имеем if-elses, проверяя определенные ошибки и перенаправляя соответственно.
Сказали, должен ли я использовать API-грамм, чтобы иметь более простые функции, которые не бросают исключения? Является ли
if user.has_permission_in_product?
if object.doesnt_exist_in_product?
do something
else
redirect somewhere with errors
end
else
redirect somewhere else with errors
end
предпочтительнее
begin
do something
rescue APIError => e
if e.message =~ "no permission"
redirect somewhere with errors
elsif e.message =~ "already exists"
redirect somewhere else with errors
end
end
Кроме того, если первый является предпочтительным, как мы имеем дело с фактическими ошибками API, которые могут быть выброшены в этих функций? Разве мы пузырём их в rescue_from в контроллере?
Лучше ли поймать и иметь дело с исключениями в модели или бросить их в модель и справиться с ними в контроллере?
Я действительно знаю о rescue_from. Я предполагаю, что более уместным вопросом для меня было бы спросить: это плохая практика (и если да, почему?) Использовать исключения для контроля моего приложения? Должен ли я стараться избегать исключений, когда это возможно? – NolanDC
Думаю, вам следует избегать их. –
Некоторые утверждают, что их бросок упрощает управление вашим кодом. Бросьте ошибку вниз, и поймайте ее высоко. Пока вы убедитесь, что все правильно очищено. – baash05