]> git.llucax.com Git - software/druntime.git/blob - src/common/core/exception.d
Removed stdc directory. This was moved to core/stdc.
[software/druntime.git] / src / common / core / exception.d
1 /**
2  * The exception module defines all system-level exceptions and provides a
3  * mechanism to alter system-level error handling.
4  *
5  * Copyright: Copyright (c) 2005-2008, The D Runtime Project
6  * License:   BSD Style, see LICENSE
7  * Authors:   Sean Kelly
8  */
9 module core.exception;
10
11
12 private
13 {
14     alias void  function( string file, size_t line, string msg = null ) assertHandlerType;
15
16     assertHandlerType   assertHandler   = null;
17 }
18
19
20 /**
21  * Thrown on an array bounds error.
22  */
23 class ArrayBoundsException : Exception
24 {
25     this( string file, size_t line )
26     {
27         super( "Array index out of bounds", file, line );
28     }
29 }
30
31
32 /**
33  * Thrown on an assert error.
34  */
35 class AssertException : Exception
36 {
37     this( string file, size_t line )
38     {
39         super( "Assertion failure", file, line );
40     }
41
42     this( string msg, string file, size_t line )
43     {
44         super( msg, file, line );
45     }
46 }
47
48
49 /**
50  * Thrown on finalize error.
51  */
52 class FinalizeException : Exception
53 {
54     ClassInfo   info;
55
56     this( ClassInfo c, Exception e = null )
57     {
58         super( "Finalization error", e );
59         info = c;
60     }
61
62     override string toString()
63     {
64         return "An exception was thrown while finalizing an instance of class " ~ info.name;
65     }
66 }
67
68
69 /**
70  * Thrown on hidden function error.
71  */
72 class HiddenFuncException : Exception
73 {
74     this( ClassInfo ci )
75     {
76         super( "Hidden method called for " ~ ci.name );
77     }
78 }
79
80
81 /**
82  * Thrown on an out of memory error.
83  */
84 class OutOfMemoryException : Exception
85 {
86     this( string file, size_t line )
87     {
88         super( "Memory allocation failed", file, line );
89     }
90
91     override string toString()
92     {
93         return msg ? super.toString() : "Memory allocation failed";
94     }
95 }
96
97
98 /**
99  * Thrown on a switch error.
100  */
101 class SwitchException : Exception
102 {
103     this( string file, size_t line )
104     {
105         super( "No appropriate switch clause found", file, line );
106     }
107 }
108
109
110 /**
111  * Thrown on a unicode conversion error.
112  */
113 class UnicodeException : Exception
114 {
115     size_t idx;
116
117     this( string msg, size_t idx )
118     {
119         super( msg );
120         this.idx = idx;
121     }
122 }
123
124
125 ///////////////////////////////////////////////////////////////////////////////
126 // Overrides
127 ///////////////////////////////////////////////////////////////////////////////
128
129
130 /**
131  * Overrides the default assert hander with a user-supplied version.
132  *
133  * Params:
134  *  h = The new assert handler.  Set to null to use the default handler.
135  */
136 void setAssertHandler( assertHandlerType h )
137 {
138     assertHandler = h;
139 }
140
141
142 ///////////////////////////////////////////////////////////////////////////////
143 // Overridable Callbacks
144 ///////////////////////////////////////////////////////////////////////////////
145
146
147 /**
148  * A callback for assert errors in D.  The user-supplied assert handler will
149  * be called if one has been supplied, otherwise an AssertException will be
150  * thrown.
151  *
152  * Params:
153  *  file = The name of the file that signaled this error.
154  *  line = The line number on which this error occurred.
155  */
156 extern (C) void onAssertError( string file, size_t line )
157 {
158     if( assertHandler is null )
159         throw new AssertException( file, line );
160     assertHandler( file, line );
161 }
162
163
164 /**
165  * A callback for assert errors in D.  The user-supplied assert handler will
166  * be called if one has been supplied, otherwise an AssertException will be
167  * thrown.
168  *
169  * Params:
170  *  file = The name of the file that signaled this error.
171  *  line = The line number on which this error occurred.
172  *  msg  = An error message supplied by the user.
173  */
174 extern (C) void onAssertErrorMsg( string file, size_t line, string msg )
175 {
176     if( assertHandler is null )
177         throw new AssertException( msg, file, line );
178     assertHandler( file, line, msg );
179 }
180
181
182 ///////////////////////////////////////////////////////////////////////////////
183 // Internal Error Callbacks
184 ///////////////////////////////////////////////////////////////////////////////
185
186
187 /**
188  * A callback for array bounds errors in D.  An ArrayBoundsException will be
189  * thrown.
190  *
191  * Params:
192  *  file = The name of the file that signaled this error.
193  *  line = The line number on which this error occurred.
194  *
195  * Throws:
196  *  ArrayBoundsException.
197  */
198 extern (C) void onArrayBoundsError( string file, size_t line )
199 {
200     throw new ArrayBoundsException( file, line );
201 }
202
203
204 /**
205  * A callback for finalize errors in D.  A FinalizeException will be thrown.
206  *
207  * Params:
208  *  e = The exception thrown during finalization.
209  *
210  * Throws:
211  *  FinalizeException.
212  */
213 extern (C) void onFinalizeError( ClassInfo info, Exception ex )
214 {
215     throw new FinalizeException( info, ex );
216 }
217
218
219 /**
220  * A callback for hidden function errors in D.  A HiddenFuncException will be
221  * thrown.
222  *
223  * Throws:
224  *  HiddenFuncException.
225  */
226 extern (C) void onHiddenFuncError( Object o )
227 {
228     throw new HiddenFuncException( o.classinfo );
229 }
230
231
232 /**
233  * A callback for out of memory errors in D.  An OutOfMemoryException will be
234  * thrown.
235  *
236  * Throws:
237  *  OutOfMemoryException.
238  */
239 extern (C) void onOutOfMemoryError()
240 {
241     // NOTE: Since an out of memory condition exists, no allocation must occur
242     //       while generating this object.
243     throw cast(OutOfMemoryException) cast(void*) OutOfMemoryException.classinfo.init;
244 }
245
246
247 /**
248  * A callback for switch errors in D.  A SwitchException will be thrown.
249  *
250  * Params:
251  *  file = The name of the file that signaled this error.
252  *  line = The line number on which this error occurred.
253  *
254  * Throws:
255  *  SwitchException.
256  */
257 extern (C) void onSwitchError( string file, size_t line )
258 {
259     throw new SwitchException( file, line );
260 }
261
262
263 /**
264  * A callback for unicode errors in D.  A UnicodeException will be thrown.
265  *
266  * Params:
267  *  msg = Information about the error.
268  *  idx = String index where this error was detected.
269  *
270  * Throws:
271  *  UnicodeException.
272  */
273 extern (C) void onUnicodeError( string msg, size_t idx )
274 {
275     throw new UnicodeException( msg, idx );
276 }