ruby on rails - rails菜鸟教程 - 在Ruby中开始,拯救和确保?




ruby on rails菜鸟教程 (5)

我最近开始使用Ruby进行编程,并且正在寻找异常处理。

我想知道是否ensure在C#中finally的Ruby等价物? 我应该有:

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

即使没有引发异常,是否ensure被调用?


仅供参考,即使在rescue部分重新生成异常,在代码执行继续到下一个异常处理程序之前,将执行ensure块。 例如:

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

如果你想确保文件关闭,你应该使用File.open的块格式:

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

是的, ensurefinally 保证块将被执行 。 这对确保关键资源受到保护非常有用,例如关闭出错文件句柄或释放互斥锁。


是的, ensure在任何情况下都会被调用。 有关更多信息,请参阅Programming Ruby book的“ Exceptions,Catch和Throw ”并搜索“确保”。


这就是为什么我们需要ensure

def hoge
  begin
    raise
  rescue  
    raise # raise again
  ensure  
    puts 'ensure' # will be executed
  end  
  puts 'end of func' # never be executed
end  






error-handling