2010-06-30 2 views
4

В настоящее время я участвую в разработке приложения больших рельсов, которое взаимодействует с другим продуктом через собственный 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 в контроллере?

Лучше ли поймать и иметь дело с исключениями в модели или бросить их в модель и справиться с ними в контроллере?

ответ

12

Вы ищете rescue_from?

В контроллере, сделайте следующее:

class MyController < ApplicationController 
    rescue_from ActiveRecord::RecordNotFound, :with => :render_missing 

    def render_missing 
     render 'This is a 404', :status => 404 
    end 
end 

Это запустит метод render_missing каждый раз приподняла ActiveRecord::RecordNotFound исключение.
Вы можете использовать его с любым классом исключений, который пожелаете. И вам больше не нужно начинать/спасать в контроллерах.

Конечно, любое исключение, поднятое в модели, также может быть захвачено rescue_from.

+2

Я действительно знаю о rescue_from. Я предполагаю, что более уместным вопросом для меня было бы спросить: это плохая практика (и если да, почему?) Использовать исключения для контроля моего приложения? Должен ли я стараться избегать исключений, когда это возможно? – NolanDC

+0

Думаю, вам следует избегать их. –

+2

Некоторые утверждают, что их бросок упрощает управление вашим кодом. Бросьте ошибку вниз, и поймайте ее высоко. Пока вы убедитесь, что все правильно очищено. – baash05

Смежные вопросы