スコープの中で scope 文を使うと, そのスコープから抜け出すときに 任意の文を実行できる.
scopeguide.d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import std.stdio;
class Foo{
void open(){
writeln("open");
throw new Exception("open error");
}
void close(){
writeln("close");
}
}
void main(){
writeln("{");
{
scope(failure){
/*
例外を発生時に実行される
*/
writeln("scope(failure)");
}
scope(success){
writeln("scope(success)");
/*
例外が発生なしかったときに実行される
*/
}
scope(exit){
/*
例外発生の有無に依らず必ず実行される
*/
writeln("scope(exit)");
x.close();
}
Foo x = new Foo;
x.open(); // この中で例外発生
}
writeln("}");
}
|
scopeguide.d の実行結果は:
[cactus:~/code_d/d_tuts]% ./scopeguide
{
open
scope(exit)
close
scope(failure)
object.Exception: open error
----------------
5 scopeguide 0x0000192c _Dmain + 76
6 scopeguide 0x00010197 extern (C) int rt.dmain2.main(int, char**) + 23
7 scopeguide 0x000100ce extern (C) int rt.dmain2.main(int, char**) + 42
8 scopeguide 0x000101df extern (C) int rt.dmain2.main(int, char**) + 59
9 scopeguide 0x000100ce extern (C) int rt.dmain2.main(int, char**) + 42
10 scopeguide 0x0001005b main + 179
11 scopeguide 0x000018d5 start + 53
12 ??? 0x00000001 0x0 + 1