Поймать все исключения в контроллере рельсов
Есть ли способ уловить все исключенные исключения в контроллере rails, например:
def delete
schedule_id = params[:scheduleId]
begin
Schedules.delete(schedule_id)
rescue ActiveRecord::RecordNotFound
render :json => "record not found"
rescue ActiveRecord::CatchAll
#Only comes in here if nothing else catches the error
end
render :json => "ok"
end
Спасибо
Ответы
Ответ 1
begin
# do something dodgy
rescue ActiveRecord::RecordNotFound
# handle not found error
rescue ActiveRecord::ActiveRecordError
# handle other ActiveRecord errors
rescue # StandardError
# handle most other errors
rescue Exception
# handle everything else
raise
end
Ответ 2
Вы также можете определить метод rescue_from.
class ApplicationController < ActionController::Base
rescue_from ActionController::RoutingError, :with => :error_render_method
def error_render_method
respond_to do |type|
type.xml { render :template => "errors/error_404", :status => 404 }
type.all { render :nothing => true, :status => 404 }
end
true
end
end
В зависимости от вашей цели вы также можете рассмотреть возможность обработки исключений для каждого контроллера. Вместо этого используйте что-то вроде exception_handler для последовательного управления ответами на исключения. В качестве бонуса этот подход также будет обрабатывать исключения, которые возникают на уровне промежуточного программного обеспечения, такие как разбор запросов или ошибки подключения к базе данных, которые ваше приложение не видит. Также может быть интересен камень exception_notifier.
Ответ 3
Вы можете перехватывать исключения по типу:
rescue_from ::ActiveRecord::RecordNotFound, with: :record_not_found
rescue_from ::NameError, with: :error_occurred
rescue_from ::ActionController::RoutingError, with: :error_occurred
# Don't resuce from Exception as it will resuce from everything as mentioned here "http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby" Thanks for @Thibaut Barrère for mention that
# rescue_from ::Exception, with: :error_occurred
protected
def record_not_found(exception)
render json: {error: exception.message}.to_json, status: 404
return
end
def error_occurred(exception)
render json: {error: exception.message}.to_json, status: 500
return
end
Ответ 4
rescue
без аргументов будет устранена любая ошибка.
Итак, вам нужно:
def delete
schedule_id = params[:scheduleId]
begin
Schedules.delete(schedule_id)
rescue ActiveRecord::RecordNotFound
render :json => "record not found"
rescue
#Only comes in here if nothing else catches the error
end
render :json => "ok"
end
Ответ 5
На самом деле, если вы действительно хотите все поймать, вы просто создаете свое собственное приложение исключений, которое позволяет настраивать поведение, которое обычно обрабатывается промежуточным программным обеспечением PublicExceptions: https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/middleware/public_exceptions.rb
Куча других ответов содержит драгоценные камни, которые делают это для вас, но нет причин, по которым вы не можете просто смотреть на них и делать это сами.
Предостережение: убедитесь, что вы никогда не создавали исключение в своем обработчике исключений. В противном случае вы получите уродливое FAILSAFE_RESPONSE https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/middleware/show_exceptions.rb#L4-L22
BTW, поведение в контроллере происходит от спасителя: https://github.com/rails/rails/blob/4-2-stable/activesupport/lib/active_support/rescuable.rb#L32-L51