Ruby - Exception processing: ensure
| Ruby user's guide | Exception processing: ensure | |
There may be cleanup work that is necessary when a method finishes
its work. Perhaps an open file should be closed, buffered data
should be flushed, etc. If there were always only one exit point
for each method, we could confidently put our cleanup code in one
place and know that it would be executed; however, a method might
return from several places, or our intended cleanup code might be
unexpectedly skipped because of an exception.
begin
file = open("/tmp/some_file", "w")
# ... write to the file ...
file.close
end |
In the above, if an exception occurred during the section of code
where we were writing to the file, the file would be left open.
And we don't want to resort to this kind of redundancy:
begin
file = open("/tmp/some_file", "w")
# ... write to the file ...
file.close
rescue
file.close
fail # raise an exception
end |
It's clumsy, and gets out of hand when the code gets more
complicated because we have to deal with every return
and
break
.
For this reason we add another keyword to the
"begin...rescue...end
" scheme, which is
ensure
. The ensure
code block executes
regardless of the success or failure of the begin
block.
begin
file = open("/tmp/some_file", "w")
# ... write to the file ...
rescue
# ... handle the exceptions ...
ensure
file.close # ... and this always happens.
end |
It is possible to use ensure
without
rescue
, or vice versa, but if they are used together in
the same begin...end
block, the rescue
must
precede the ensure
.