2010-05-27 2 views
2

В настоящее время я нахожусь в Rails 2.3.5, и я стараюсь, чтобы исключения были исключены из моего приложения как можно более аккуратные.Есть ли хорошие рекомендации по обработке исключений в рельсах?

Мои ApplicationController выручает выглядеть это сейчас:

rescue_from Acl9::AccessDenied, :with => :access_denied 
    rescue_from Exceptions::NotPartOfGroup, :with => :not_part_of_group 
    rescue_from Exceptions::SomethingWentWrong, :with => :something_went_wrong 
    rescue_from ActiveRecord::RecordNotFound, :with => :something_went_wrong 
    rescue_from ActionController::UnknownAction, :with => :something_went_wrong 
    rescue_from ActionController::UnknownController, :with => :something_went_wrong 
    rescue_from ActionController::RoutingError, :with => :something_went_wrong 

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

Благодаря

ответ

5

Вы можете поймать более общие исключения, но вы должны поместить их в верхней части, а expained here

Например, чтобы поймать все другие исключения, вы можете сделать

rescue_from Exception, :with => :error_generic 
rescue_from ... #all others rescues 

Но если вы это сделаете, убедитесь, что вы хотя бы регистрируете исключение, или вы никогда не узнаете, что не так с вашим приложением:

def error_generic(exception) 
    log_error(exception) 
    #your rescue code 
end 

также можно определить несколько классов исключений в строке для одного обработчика:

rescue_from Exceptions::SomethingWentWrong, ActiveRecord::RecordNotFound, ... , :with => :something_went_wrong 
1

Вы можете определить метод крюк в ApplicationController так:

def rescue_action_in_public(exception) 
    case exception 

    when ActiveRecord::RecordNotFound, ActionController::UnknownAction, ActionController::RoutingError 
    redirect_to errors_path(404), :status=>301 
    else 
    redirect_to errors_path(500) 
    end 
end 
0

Недавно я выпустил рельсы 3 жемчужины (вопиющие), которые будут ломать общие исключения с помощью rescue_from и обеспечивать четко определенные коды состояния HTTP и ответы об ошибках f или html, json и xml.

По умолчанию он пытается сделать правильную вещь. Вы можете добавить любое или изменить любые исключения и коды состояния в инициализаторе.

Это может быть или не соответствовать вашим потребностям. https://github.com/voomify/egregious

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