summaryrefslogtreecommitdiff
path: root/contrib/utility/Documentation/ExH/Example/hello_world.cpp.html
blob: 3d2497f325e89a9a7c6b4704c1f72447201f95c6 (plain)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<html>
<head>
<!-- Generated by the Spirit (http://spirit.sf.net) C++ to HTML Converter -->
<title>
hello_world.cpp</title>
<link rel="stylesheet" href="../../../Documentation/Style/CXX.css" type="text/css"></head>
<body>
<pre>
<span class=comment>// file      : Example/ExH/HelloWorld/hello_world.cpp
// author    : Boris Kolpackov &lt;boris@kolpackov.net&gt;
// copyright : Copyright (c) 2002-2003 Boris Kolpackov
// license   : http://kolpackov.net/license.html

</span><span class=preprocessor>#include &lt;cstdlib&gt; // for std::abort ()

</span><span class=preprocessor>#include &lt;string&gt;
</span><span class=preprocessor>#include &lt;iostream&gt;

</span><span class=preprocessor>#include &quot;Utility/ExH/System/Exception.hpp&quot;
</span><span class=preprocessor>#include &quot;Utility/ExH/Logic/Exception.hpp&quot;

</span><span class=keyword>using </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>cerr</span><span class=special>;
</span><span class=keyword>using </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>cout</span><span class=special>;
</span><span class=keyword>using </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>endl</span><span class=special>;

</span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>Utility</span><span class=special>;

</span><span class=keyword>class </span><span class=identifier>Application
</span><span class=special>{
</span><span class=keyword>public</span><span class=special>:
  </span><span class=keyword>class </span><span class=identifier>Exception </span><span class=special>: </span><span class=keyword>public </span><span class=identifier>ExH</span><span class=special>::</span><span class=identifier>Logic</span><span class=special>::</span><span class=identifier>Exception </span><span class=special>{};

  </span><span class=comment>// Hint: you may want to try again...
  </span><span class=keyword>class </span><span class=identifier>FeelingDizzy  </span><span class=special>: </span><span class=keyword>public </span><span class=identifier>Exception </span><span class=special>{};

  </span><span class=keyword>class </span><span class=identifier>InvalidArg </span><span class=special>: </span><span class=keyword>public </span><span class=identifier>Exception </span><span class=special>{};

</span><span class=keyword>public</span><span class=special>:
  </span><span class=identifier>Application </span><span class=special>() </span><span class=keyword>throw </span><span class=special>(</span><span class=identifier>ExH</span><span class=special>::</span><span class=identifier>System</span><span class=special>::</span><span class=identifier>Exception</span><span class=special>)
      </span><span class=special>: </span><span class=comment>// The std::string c-tor may throw any kind of exceptions besides
        // quite possible std::bad_alloc.
        </span><span class=identifier>greeting_ </span><span class=special>(</span><span class=string>&quot;Hello, world!&quot;</span><span class=special>)
  </span><span class=special>{
  </span><span class=special>}

  </span><span class=identifier>Application </span><span class=special>(</span><span class=keyword>char </span><span class=keyword>const </span><span class=special>* </span><span class=identifier>greeting</span><span class=special>) </span><span class=keyword>throw </span><span class=special>(</span><span class=identifier>InvalidArg</span><span class=special>,
                                             </span><span class=identifier>ExH</span><span class=special>::</span><span class=identifier>System</span><span class=special>::</span><span class=identifier>Exception</span><span class=special>)
      </span><span class=special>: </span><span class=identifier>greeting_ </span><span class=special>(</span><span class=identifier>greeting </span><span class=special>== </span><span class=number>0 </span><span class=special>? </span><span class=string>&quot;&quot; </span><span class=special>: </span><span class=identifier>greeting</span><span class=special>)
  </span><span class=special>{
    </span><span class=keyword>if </span><span class=special>(</span><span class=identifier>greeting </span><span class=special>== </span><span class=number>0</span><span class=special>) </span><span class=keyword>throw </span><span class=identifier>InvalidArg </span><span class=special>();
  </span><span class=special>}

</span><span class=keyword>public</span><span class=special>:

  </span><span class=keyword>void
  </span><span class=identifier>run </span><span class=special>() </span><span class=keyword>throw </span><span class=special>(</span><span class=identifier>FeelingDizzy</span><span class=special>, </span><span class=identifier>ExH</span><span class=special>::</span><span class=identifier>System</span><span class=special>::</span><span class=identifier>Exception</span><span class=special>)
  </span><span class=special>{
    </span><span class=keyword>static </span><span class=keyword>unsigned </span><span class=keyword>int </span><span class=identifier>dizzy_count </span><span class=special>(</span><span class=number>0</span><span class=special>);

    </span><span class=keyword>if </span><span class=special>(</span><span class=identifier>dizzy_count</span><span class=special>++ </span><span class=special>&lt; </span><span class=number>5</span><span class=special>) </span><span class=keyword>throw </span><span class=identifier>FeelingDizzy </span><span class=special>();

    </span><span class=comment>// The next line can throw full bucket of exceptions
    // not to mention ios_base::failure.
    </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=identifier>greeting_</span><span class=special>.</span><span class=identifier>c_str </span><span class=special>() </span><span class=special>&lt;&lt; </span><span class=identifier>endl</span><span class=special>;
  </span><span class=special>}

</span><span class=keyword>private</span><span class=special>:

  </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string  </span><span class=identifier>greeting_</span><span class=special>;
</span><span class=special>};



</span><span class=keyword>int
</span><span class=identifier>main </span><span class=special>()
</span><span class=special>{
  </span><span class=comment>// This is a catch-all layer that should be in use only
  // if we are really in trouble.
  </span><span class=keyword>try
  </span><span class=special>{
    </span><span class=comment>// This is a catch-system layer. Here we will catch exceptions like
    // bad_alloc, etc. If we get here it means that nobody wanted/managed
    // to recover from this kind of errors.
    </span><span class=keyword>try
    </span><span class=special>{
      </span><span class=comment>// This is a catch-logic layer. If we get here it usually
      // indicates an application logic error.
      </span><span class=keyword>try
      </span><span class=special>{

        </span><span class=comment>// Ok, here we go about our application logic.
        </span><span class=keyword>try
        </span><span class=special>{
          </span><span class=keyword>for </span><span class=special>(</span><span class=keyword>int </span><span class=identifier>i </span><span class=special>= </span><span class=number>0</span><span class=special>; </span><span class=identifier>i </span><span class=special>&lt; </span><span class=number>10</span><span class=special>; </span><span class=identifier>i</span><span class=special>++)
          </span><span class=special>{
            </span><span class=keyword>try
            </span><span class=special>{
              </span><span class=identifier>Application </span><span class=identifier>app </span><span class=special>(</span><span class=string>&quot;Hi dude!&quot;</span><span class=special>);
              </span><span class=identifier>app</span><span class=special>.</span><span class=identifier>run </span><span class=special>();
              </span><span class=keyword>break</span><span class=special>;
            </span><span class=special>}
            </span><span class=keyword>catch </span><span class=special>(</span><span class=identifier>Application</span><span class=special>::</span><span class=identifier>FeelingDizzy </span><span class=keyword>const</span><span class=special>&amp; </span><span class=special>)
            </span><span class=special>{
              </span><span class=keyword>if </span><span class=special>(</span><span class=identifier>i </span><span class=special>== </span><span class=number>9</span><span class=special>)
              </span><span class=special>{
                </span><span class=identifier>cerr </span><span class=special>&lt;&lt; </span><span class=string>&quot;Given up!&quot; </span><span class=special>&lt;&lt; </span><span class=identifier>endl</span><span class=special>;
                </span><span class=keyword>return </span><span class=special>-</span><span class=number>1</span><span class=special>;
              </span><span class=special>}
              </span><span class=keyword>else
              </span><span class=special>{
                </span><span class=identifier>cerr </span><span class=special>&lt;&lt; </span><span class=string>&quot;Application is feeling dizzy. Trying again...&quot;
                     </span><span class=special>&lt;&lt; </span><span class=identifier>endl</span><span class=special>;
              </span><span class=special>}
            </span><span class=special>}
          </span><span class=special>}
        </span><span class=special>}
        </span><span class=keyword>catch </span><span class=special>(</span><span class=identifier>Application</span><span class=special>::</span><span class=identifier>InvalidArg </span><span class=keyword>const</span><span class=special>&amp; </span><span class=special>)
        </span><span class=special>{
          </span><span class=identifier>cerr </span><span class=special>&lt;&lt; </span><span class=string>&quot;Cought Application::InvalidArg : ...hmm... strange!&quot;
               </span><span class=special>&lt;&lt; </span><span class=identifier>endl</span><span class=special>;
          </span><span class=keyword>return </span><span class=special>-</span><span class=number>1</span><span class=special>;
        </span><span class=special>}
      </span><span class=special>}
      </span><span class=keyword>catch </span><span class=special>(</span><span class=identifier>ExH</span><span class=special>::</span><span class=identifier>Logic</span><span class=special>::</span><span class=identifier>Exception </span><span class=keyword>const</span><span class=special>&amp; </span><span class=identifier>e</span><span class=special>)
      </span><span class=special>{
        </span><span class=identifier>cerr </span><span class=special>&lt;&lt; </span><span class=string>&quot;Caught Logic::Exception : &quot; </span><span class=special>&lt;&lt; </span><span class=identifier>e</span><span class=special>.</span><span class=identifier>what </span><span class=special>() </span><span class=special>&lt;&lt; </span><span class=identifier>endl</span><span class=special>;
        </span><span class=keyword>return </span><span class=special>-</span><span class=number>1</span><span class=special>;
      </span><span class=special>}
    </span><span class=special>}
    </span><span class=keyword>catch </span><span class=special>(</span><span class=keyword>const </span><span class=identifier>ExH</span><span class=special>::</span><span class=identifier>System</span><span class=special>::</span><span class=identifier>Exception</span><span class=special>&amp; </span><span class=identifier>e</span><span class=special>)
    </span><span class=special>{
      </span><span class=identifier>cerr </span><span class=special>&lt;&lt; </span><span class=string>&quot;Caught System::Exception : &quot; </span><span class=special>&lt;&lt; </span><span class=identifier>e</span><span class=special>.</span><span class=identifier>what </span><span class=special>() </span><span class=special>&lt;&lt; </span><span class=identifier>endl</span><span class=special>;
      </span><span class=keyword>return </span><span class=special>-</span><span class=number>1</span><span class=special>;
    </span><span class=special>}
    </span><span class=keyword>catch </span><span class=special>(...)
    </span><span class=special>{
      </span><span class=identifier>cerr </span><span class=special>&lt;&lt; </span><span class=string>&quot;Caught unknown exception using catch-all handler. &quot; </span><span class=special>&lt;&lt; </span><span class=identifier>endl</span><span class=special>;
      </span><span class=keyword>return </span><span class=special>-</span><span class=number>1</span><span class=special>;
    </span><span class=special>}
  </span><span class=special>}
  </span><span class=keyword>catch </span><span class=special>(...)
  </span><span class=special>{
    </span><span class=comment>// We get here in cases of some hard failure. For example when handling
    // exception, operator &lt;&lt; throws another exception. Usually application
    // cannot handle such failures itself so we just propagate it futher.
    </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>abort </span><span class=special>();
  </span><span class=special>}
</span><span class=special>}
</span></pre>
</body>
</html>
<!-- $Id$ -->