Не ловить исключение тайм-аута единорога в рельсах - PullRequest
1 голос
/ 10 июля 2020

Это пример кода, который я пытаюсь обработать исключение от единорога.

unicron.rb

worker_processes Integer(ENV['WEB_CONCURRENCY'] || 3)
timeout 15
preload_app true

timeout.rb

Rack::Timeout.timeout = 12

Пример кода

def create_store
   ActiveRecord::Base.transaction do

     @store = Store.new(params[:store])
     if @store.save!
       sleep 12.3
       InformUserWorker.perform_async(store_id)
     end

   end

   rescue => exception
    exception.backtrace.each { |trace| puts trace }
   rescue Timeout::Error
    puts 'That took too long, exiting...1'
   rescue Rack::Timeout::RequestTimeoutException
    puts 'That took too long, exiting...2'
   rescue Rack::Timeout::RequestTimeoutError
    puts 'That took too long, exiting...3'
   rescue Rack::Timeout::RequestExpiryError
    puts 'That took too long, exiting...4'
end

Я получаю code=H13 desc="Connection closed without response" с этим спящим 12,3 секунды, и происходит откат транзакции, но ни одно из этих исключений не выполнение. Я добавил сюда пару исключений. Что-то здесь не так?.

1 Ответ

0 голосов
/ 10 июля 2020

Спасательные операции выполняются по порядку. Таким образом, ваше первое спасение фиксирует все, что поднимается, и код никогда не переходит за эту точку.

Попробуйте поместить его последним:

 # other rescues in here.
 rescue => exception
  exception.backtrace.each { |trace| puts trace }
 end # this one is the last, only executed if none of the others are

Если проблема в том, что вы не уверены, какой поднимается класс, просто используйте что-то вроде pry для отладки exception.class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...