scope file.open

Frits van Bommel fvbommel at REMwOVExCAPSs.nl
Wed Jan 24 06:23:16 PST 2007


Jarrett Billingsley wrote:
> "nobody" <not at possible.de> wrote in message 
> news:ep7395$o92$1 at digitaldaemon.com...
> 
>> The question is, how scope know it's a failure to open a file, before the 
>> file.open statement
>> is executed.
>> That is i didn't understand.
> 
> What the scope(failure) statement does is "registers" the following piece of 
> code to be executed whenever the current scope (brace block) is left.  So 
> you can put it anywhere:

1) It only gets executed when the scope is exited by exception unwinding.
2) It only gets executed when that exception happens *after* the scope 
statement.

http://www.digitalmars.com/d/statement.html#ScopeGuardStatement

> scope(failure) writefln("Datei kann nicht geoeffnet werden ");
> File file = new File;
> file.open("testdatei.txt",FileMode.In);
> while(!file.eof()) writefln(file.readLine());
> file.close();

That'll work.

> Or:
> 
> File file = new File;
> scope(failure) writefln("Datei kann nicht geoeffnet werden ");
> file.open("testdatei.txt",FileMode.In);
> while(!file.eof()) writefln(file.readLine());
> file.close();

That'll only print if 'new File' is successful (i.e. there's enough 
memory and the constructor doesn't throw an exception) but an exception 
gets thrown in the rest of the code.

> Or even:
> 
> File file = new File;
> file.open("testdatei.txt",FileMode.In);
> while(!file.eof()) writefln(file.readLine());
> file.close();
> scope(failure) writefln("Datei kann nicht geoeffnet werden ");

That will *not* work. It's just too late to affect any code.

> It doesn't matter where the scope(failure) appears.  It just means "if an 
> exception passes out of this block, run this code." 

It's "If an exception passes out of this block *after this statement*, 
run this code", actually.

See for yourself:
-----
urxae at urxae:~/tmp$ cat test.d
import std.stdio;

void main() {
     scope(failure) writefln("will print");
     throw new Exception("will be thrown");
     scope(failure) writefln("won't print");
}
urxae at urxae:~/tmp$ dmd -run test.d
will print
Error: will be thrown
-----


More information about the Digitalmars-d-learn mailing list