Ruby - 使用不同的参数重试函数

Ruby - retry function with different params

我想根据第一次迭代的结果重试具有不同参数的函数:

重试功能如下:

 def retry_on_fail(**args)
   yield
 rescue StandardError => e
    args = args.merge(different_param => true) if e.class == `specific_error`
    retry

有办法吗?我还没找到... 谢谢!

您可以在一个方法中任意多次让出,而技巧实际上是将参数传递给块:

# given
class SpecificError < StandardError; end

def retry_on_fail(**args)
  yield(args)
rescue SpecificError 
  yield(args.merge(different_param: true))
end
retry_on_fail do |args|
  raise SpecificError if args.empty?
  args
end
# returns { different_param: true }

这里在流程方面也有细微差别 - retry 从顶部运行整个方法,这将再次调用该块。如果那是你想要的,你可以这样做:

def retry_on_fail(**args)
  yield(args)
rescue SpecificError 
  args.merge!(different_param: true) 
  retry
end

但是如果块再次引发相同的异常,这有可能创建无限循环。

试试这个

def retry_on_fail(**args)
  rescue_args = args 
  begin
    yield(rescue_args)
  rescue StandardError => e
    rescue_args = rescue_args.merge(different_param => true) if e.class == `specific_error`
    retry
  end  
end