2012-11-01 40 views
0

我有以下代碼:確保在Ruby中關閉文件,救援和確保

begin 
    @output_file = File.open("output.txt", "w") 
    File.read(@input_file).each_line do |line| 
    taxify_line(line) 
end 
rescue => e 
    p "Smz went wrong..." 
end 
@output_file.write("Last line of output") 
@output_file.close unless @output_file.nil? 

什麼是保證正確的方法,無論我趕上一個例外,這兩個文件(@input_file和@output_file )已關閉?

回答

5

rescue子句應該在begin..end塊內。而且還有,令人驚訝的是,ensure子句完全符合您的想法

begin 
    @output_file = File.open("output.txt", "w") 
    File.read(@input_file).each_line do |line| 
    taxify_line(line) 
    end 
rescue => e 
    p "Smz went wrong..." 
ensure 
    @output_file.write("Last line of output") 
    @output_file.close unless @output_file.nil? 
end 
+0

感謝您的回答。如果我不想在出錯時寫入@output_file,該怎麼辦?所以,避免這樣做:@ output_file.write(「輸出的最後一行」) - 我應該在那裏放置那一行? –

+1

在你的主體(搶救前)。 –

+0

我在Pragmatic programming ruby​​ book中閱讀以下內容;並已變得有些困惑。可有一個人請清除此設置: #start_of_code F = File.open( 「testfile的」) 開始 #..流程 救援 #..處理錯誤 確保 f.close 結束 #end_of_code 「 」初學者通常犯的錯誤是將File.open放在begin塊中,在 這種情況下,這是不正確的,因爲open本身可能會引發異常,如果發生了 ,您不會想運行在確保塊中的代碼,因爲不會有文件 關閉。「 – Nosh