Eric Jacoboni wrote:
> Hi,
>
> 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)
> end
>
> Here, 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?
> end
>
> Is there something i've missed?

Yes, as Grennady pointed out.  The benefit of using File#open with a block
is exactly that you do not have to do the closing yourself.  Less code,
less errors.

Btw, your first example is overly complex.  This does the same:

File.open("my_file") do |fic|
  fic.puts("bla")
end

17:53:40 [~]: ruby -e 'File.open("dsdsd") {|io| p io}' ; echo $?
-e:1:in `initialize': No such file or directory - dsdsd (Errno::ENOENT)
        from -e:1
1
17:53:55 [~]:

Kind regards

    robert