On Friday, January 21, 2011 14:49:44 Andrej Mitrovic wrote: > When there are multiple calls that can fail, and where I have to do > clean-up code in a certain order and under certain conditions I use > scope(exit). For example: > > import std.stdio; > import std.exception; > > void main() > { > foo(); > } > > enum NoError = true; > > bool Initialize() { return true; } > bool Start() { return false; } > > void Terminate() { writeln("Terminated."); } > void Stop() { writeln("Stopped."); } > > void foo() > { > auto error = Initialize(); > enforce(error == NoError, new Exception("Couldn't initialize")); > scope(exit) > Terminate(); // call Terminate only if Initialize was successful > > error = Start(); > enforce(error == NoError, new Exception("Couldn't start")); > scope(exit) > Stop(); // call Stop only if Start was successful > } > > If I change the first scope to scope(success), Terminate will not be > called if the call to Start() failed. This can be bad in cases where > Terminate would release some hardware resource (it can lock up an app, > for example). scope statements won't be ran if an exception is throwed > before that scope statement is reached. So, that's one thing to keep > in mind.
That's why you choose the appropriate version of scope(). And while scope(success) is still definitely useful, it's far less useful than scope(failure) or scope(exit). - Jonathan M Davis