我最近开始用Ruby编程,我正在研究异常处理。

我想知道Ruby中的ensure是否等同于c#中的finally ?我应该:

file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

还是我应该这样做?

#store the file
file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
  file.close
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

确保得到调用无论什么,即使异常没有被引发?


当前回答

是的,确保确保它每次都运行,所以你不需要这个文件。在开始块中关闭。

顺便说一下,测试的好方法是:

begin
  # Raise an error here
  raise "Error!!"
rescue
  #handle the error here
ensure
  p "=========inside ensure block"
end

您可以测试一下,当出现异常时,是否会打印出“=========inside ensure block”。 然后,您可以注释掉引发错误的语句,并通过查看是否打印出任何内容来查看ensure语句是否被执行。

其他回答

是的,在任何情况下都会调用ensure。有关更多信息,请参阅Programming Ruby书中的“exception, Catch, and Throw”,并搜索“ensure”。

如果你想要确保一个文件是关闭的,你应该使用block形式file .open:

File.open("myFile.txt", "w") do |file|
  begin
    file << "#{content} \n"
  rescue
  #handle the error here
  end
end

是的,确保确保它每次都运行,所以你不需要这个文件。在开始块中关闭。

顺便说一下,测试的好方法是:

begin
  # Raise an error here
  raise "Error!!"
rescue
  #handle the error here
ensure
  p "=========inside ensure block"
end

您可以测试一下,当出现异常时,是否会打印出“=========inside ensure block”。 然后,您可以注释掉引发错误的语句,并通过查看是否打印出任何内容来查看ensure语句是否被执行。

是的,ensure就像最终保证块将被执行。这对于确保关键资源受到保护非常有用,例如在错误时关闭文件句柄,或释放互斥量。

供参考,即使在救援部分重新引发异常,确保块也将在代码继续执行到下一个异常处理程序之前执行。例如:

begin
  raise "Error!!"
rescue
  puts "test1"
  raise # Reraise exception
ensure
  puts "Ensure block"
end