スコープガイド

スコープの中で 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

Previous topic

遅延評価

Next topic

単体テスト