2014-06-09 35 views
0

比方說,我遍歷一些項目在數組中,像這樣:提高迭代器內的錯誤,並繼續下一個項目

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 

所有你看到像上面這樣驗證操作,解密,進口,上傳是創建新對象的方法。

讓我們說在這些步驟中的任何一步可能會失敗(無論文件是無效的,不能解密等)。我想在這些進程中引發錯誤,但要確保它返回(返回到發生迭代的類)並繼續到數組中的下一個文件路徑。

例如在校驗類(這是驗證類,如果不是在上面的例子清楚),我可能有這樣的事情:

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

只是包裝中的代碼開始/救援/結束,救援將捕獲錯誤,然後繼續下一個迭代:

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你可以從救援電話與再次嘗試當前的迭代。當然你可能需要一些條件,如重試計數等,以確保你不會陷入無限循環。

+0

我有類似的東西,但程序仍然停止運行,如果發生錯誤。 –

+0

你能證明你有什麼?停止時會發生什麼樣的錯誤? – Headshota

+0

'rescue'後可以跟一個捕獲異常的參數列表(例如'ArgumentError');如果沒有參數,則錯誤類型默認爲「StandardError」。你也可以爲不同的錯誤分開'rescue'子句,並且在每個參數列表之後你可以添加'=> var_name',在這種情況下,Ruby將把錯誤信息分配給你指定的變量。 –