假设我正在循环遍历数组中的某些项目:
class ImportHandler
attr_reader :files
def initialize
@files = ['file_path','file_path2']
end
def process
files.each do |file|
begin
if validate(file) && decrypt(file)
import(file)
upload(file)
end
rescue Exception => e
raise e
end
end
end
def validate(file)
FileValidator.new(file).run
end
end
您在上面看到的所有操作(如验证,解密,导入和上传)都是创建新对象的方法。
让我们说,在任何这些步骤中,某些事情可能会失败(文件是否有效,无法解密等)。我想在任何这些进程中引发错误,但要确保它返回(返回到正在进行迭代的类)并继续到数组中的下一个文件路径。
例如在validate类中(如果上面的例子中没有明确的那样,这是验证的类),我可能会这样:
class FileValidator
attr_reader :file
def initialize(file)
@file = file
end
def hash_validation(file_path)
unless file.hash == metdata_hash
raise "This file has been tampered with!"
end
end
end
我想提出该错误但确保程序返回到迭代,并继续到数组中的下一个对象。有没有一种简单的方法可以实现这一目标?
答案 0 :(得分:0)
将代码包装在begin / rescue / end中,救援将捕获错误,然后继续进行下一次迭代:
files.each do |file|
begin
if validate(file) && decrypt(file)
import(file)
upload(file)
end
rescue
// do nothing or maybe provide some output to know that error occured
end
end
还有一个retry
,您可以通过救援来调用当前迭代再次尝试。当然,您可能需要一些条件,如重试次数等,以确保您不会陷入无限循环。