From: Robert Klemme Date: 2007-09-04T19:55:30+09:00 Subject: Re: Resource Acquisition & Cleanup 2007/9/4, larsch@belunktum.dk : > Hello Rubyists, > > I am looking for a style or idiom that I can apply to a resource > management problem. I have a number of resources (objects) that I need > to release if any exception is thrown. While ensure-blocks or block > parameters work well for few resources, they get cumbersome when you > have many resources, or when the number of resources is not known. > > Let's say I have something similar to this: > > resources = [] > n.times { |i| > resources.push( Resource.new(i) } > } > > loop { > # do some processing on the resources > } > > n.times { |i| > resources[i].release > } > > If an exception is thrown in the main processing loop, i still need to > release the resources. If an exception is thrown during construction, > i need to release the resources already succesfully created. If an > exception is thrown while releasing a resource during exception > handling, i still need to release the remaining resources. > > Is there a way to do this, especially when 'n' is unknown? This is pretty simply and should satisfy your requirements: def your_method(n) res = [] begin n.times {|i| res << Resource.new(i)} loop do # main work end ensure res.each {|r| r.release rescue nil} end end Kind regards robert