Some processes need to be finished up. For example, we should close an opened file, flush data which is stored in the buffers, etc. If there is only one exit for each method, we may put anything to be done there, however, a method returns from various conditions and we must consider the alternative way to ensure finishing the process. Ruby also has `exception', which increases the way to return. See the following for instance:
ruby> begin
ruby| file = open("/tmp/some_file", "w")
ruby| # something to do
ruby| file.close
ruby| end
In the above, if an exception occurred while ``something to do''
the file will be left open.
Though the file should be closed,
we don't want the following:
ruby> begin
ruby| file = open("/tmp/some_file", "w")
ruby| # something to do
ruby| file.close
ruby| rescue
ruby| file.close
ruby| fail # raise an exception
ruby| end
It is too complicated to write, and one must respond for
each return or break.
For such situations, ruby has a syntax to describe a finishing up.
If an ensure clause is put in begin,
the clause is executed always.
ruby> begin
ruby| file = open("/tmp/some_file", "w")
ruby| # something to do
ruby| ensure
ruby| file.close
ruby| end
The section specified by ensure
is sure to be executed, so the programmer doesn't need to worry
to close the file.
By the way, if one specifies both rescue and
ensure in a begin,
the rescue must go ahead of the ensure.