Previous
Prev
Contents
Contents
Next
Next
 Ruby user's guide Don't forget to close the door (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.


Previous
Prev
Contents
Contents
Next
Next