【问题标题】:Can I put retry in rescue block without begin ... end?我可以在没有开始...结束的情况下将重试放在救援块中吗?
【发布时间】:2016-04-17 18:48:26
【问题描述】:

当 PG 无法同步时,我遇到了一个问题(众所周知的问题)(example)。

PG 不同步失败,id 序列停止递增并引发ActiveRecord::RecordNotUnique 错误。

但是这里提出的所有解决方案(我发现的所有解决方案)都提出了一些手动解决方案 - 要么在控制台中执行一些操作,要么运行自定义 rake 任务。

但是,我发现这对于生产来说并不令人满意:每次发生这种情况时,用户都会获得 500,而管理服务器的人应该可以节省时间。 (根据测试数据,由于某种原因,在我的情况下可能会经常发生)。

所以我宁愿修补 ActiveRecord 基类来捕捉这个特定的错误并挽救它。

我有时在控制器中使用这个逻辑:

class ApplicationController < ActionController::Base

  rescue_from ActionController::ParameterMissing, ActiveRecord::RecordNotFound do |e|
     # some logic here
    end
  end

但是,在这里我不需要重试。另外,我不想深入研究猴子补丁,例如,不覆盖 Base create 方法。

所以我在想这样的事情:

module ActiveRecord
   class Base


       rescue ActiveRecord::RecordNotUnique => e
         if e.message.include? '_pkey' 
           table =e.message.match(//) #regex to define table
           ActiveRecord::Base.connection.reset_pk_sequence!(table)
           retry
         else
           raise
         end
       end
     end

但它很可能不起作用,因为我不确定 Rails/Ruby 是否会理解它要求重试的确切内容。

有什么解决办法吗?

附:对于序列的整体问题的不相关解决方案,无需手动命令行命令和没有服务的用户也可以工作。

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord


    【解决方案1】:

    要回答您提出的问题,不。 rescue 只能在 begin..end 块或方法体中使用。

    begin
      bad_method
    rescue SomeException
      retry
    end
    
    def some_method
      bad_method
    rescue SomeException
      retry
    end
    

    rescue_from 只是一个框架辅助方法,因为在控制器中执行的间接性。

    回答你真正问的问题,当然。你可以用rescue/retry覆盖create_or_update

    module NonUniquePkeyRecovery
      def create_or_update(*)
        super
      rescue ActiveRecord::RecordNotUnique => e
        raise unless e.message.include? '_pkey'
        self.class.connection.reset_pk_sequence!(self.class.table_name)
        retry
      end
    end
    
    ActiveSupport.on_load(:active_record) do
      include NonUniquePkeyRecovery
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多