在迭代器中的进程期间引发错误并继续下一个项目

时间:2014-06-09 05:17:44

标签: ruby error-handling

假设我正在循环遍历数组中的某些项目:

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

我想提出该错误但确保程序返回到迭代,并继续到数组中的下一个对象。有没有一种简单的方法可以实现这一目标?

1 个答案:

答案 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,您可以通过救援来调用当前迭代再次尝试。当然,您可能需要一些条件,如重试次数等,以确保您不会陷入无限循环。