File.open is not that stupid ;-). It uses "ensure" internally to close
a file in the case of exception. Using block with open guarantees that
the file will not remain open no matter what.
Gennady.
···
-----Original Message-----
From: Eric Jacoboni [mailto:jaco@neottia.net]
Sent: Friday, February 10, 2006 8:03
To: ruby-talk ML
Subject: Yet another question on exceptionsHi,
If i use File::open to open/create a file objet, and if i use
a block with it, the file will be automatically close when
the block ends:Now, considering this buggy snippet:
begin
File.open("my_file") do |fic|
fic.puts("bla")
end
rescue Exception => e
STDERR.puts(e)
exit(1)
endHere, the "not opened for writing" exception will be raised,
the block end will never be reached and the file will remain
opened, isn't it ?
To circumvent this, i have to make fic a global variable and
put the appropriate code in a ensure clause (or open a
begin/ensure in the File.open block to close the file... too bad)So, my question is: what's the benefit of this idiom versus this one:
begin
fd = File.new("my_file")
...
rescue Exception => e
STDERR.puts(e)
exit(1)
ensure
fd.close if fd and not fd.closed?
endIs there something i've missed?
--
Eric Jacoboni, ne il y a 1442972561 secondes