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
我想根据第一次迭代的结果重试具有不同参数的函数:
重试功能如下:
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