#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Я едва освоился с Ruby / ROR, но мне нужно быстро написать класс для обработки ошибок и что-то с ними делать. Я смог найти важные примеры / руководства для остальной части того, что мне нужно, но у меня возникли проблемы с поиском наилучшей альтернативы PHP «set_error_handler».
Мои цели таковы:
- Я хотел бы написать класс, который будет автоматически фиксировать любые ошибки уровня ruby.
- Я бы хотел, чтобы класс также вызывался пользователем при наличии пользовательских ошибок / исключений для отчета.
Я бы хотел, чтобы это работало для любого приложения на ruby, но мое основное внимание также уделяется приложениям ruby-on-rails. Спасибо за ваш совет.
Комментарии:
1. В Ruby они называются исключениями.
2. Существует ли стандартный способ захвата всех исключений? (без попыток / перехватов везде)
Ответ №1:
Я думаю, что ближайшим эквивалентом в Rails является rescue_from — он позволяет вам указать, что код будет перехватывать любое заданное исключение (за исключением некоторых ошибок шаблона — хотя есть способы обойти это). Если вы хотите, вы могли бы затем передать его какому-либо другому классу. Итак, я думаю, что вы бы сделали в вашем случае, было бы:
в app / controllers /application_controller.rb:
class ApplicationController < ActionController::Base
rescue_from Exception do |e|
MyExceptionHandler.handle_exception(e)
end
end
в библиотеке/my_exception_handler.rb:
class MyExceptionHandler
def self.handle_exception exception
# your code goes here
end
end
Если это поможет, дайте мне знать, и я найду ссылку на то, как вы обнаруживаете ошибки шаблона.
Комментарии:
1. Спасибо, кажется, это в значительной степени то, что я хочу. Я попробую и дам вам знать, как это работает. Я был бы признателен, если бы вы могли указать мне на метод обработки ошибок шаблона, который вы упомянули.
2. Хорошо, готово — страница, на которой я впервые услышал о rescue_from, также касается проблемы с ошибкой шаблона: perfectline.ee/blog/custom-dynamic-error-pages-in-ruby-on-rails
Ответ №2:
begin
#require all_kinds_of_things
"abc".size(1,2)
123.reverse
# rest of brilliant app
rescue Exception => e #Custom, catch-all exeption handler
puts "Doh...#{e}"
print "Do you want the backtrace? (Y) :"
puts e.backtrace if gets.chomp == "Y"
end
Ответ №3:
Определите ApplicationController#rescue_in_public(exception)
и поместите туда свой пользовательский код обработки.
Это увеличивает обработку исключений Rails по умолчанию на верхнем уровне — прямо перед генерированием HTTP-ответа. По мере усложнения ваших приложений Rails и использования внешних ресурсов будет появляться все больше исключений, которые вам захочется обрабатывать гораздо ближе к месту возникновения исключений, но это может помочь вам начать.
Этот метод будет работать только с HTTP-запросами и не будет перехватывать исключения в любых пользовательских задачах rake, которые вы создаете, или в коде, выполняемом через rails runner
.
Вот пример из одного из моих приложений:
class ApplicationController < ActionController::Base
...
protected
def rescue_action_in_public (exception)
case exception
when ActionController::InvalidAuthenticityToken
if request.xhr?
render :update do |page|
page.redirect_to '/sessions/new/'
end
else
redirect_to '/sessions/new/'
end
when ActionController::NotImplemented
RAILS_DEFAULT_LOGGER.info("ActionController::NotImplementedn#{request.inspect}")
render :nothing => true, :status => '500 Error'
else
super
end
end
end