]> git.llucax.com Git - software/druntime.git/blob - src/common/core/exception.d
Added core.vararg for variadic argument handling. This seemed necessary, since varar...
[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 a range error.
22  */
23 class RangeError : Error
24 {
25     this( string file, size_t line )
26     {
27         super( "Range violation", file, line );
28     }
29 }
30
31
32 /**
33  * Thrown on an assert error.
34  */
35 class AssertError : Error
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 FinalizeError : Error
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 HiddenFuncError : Error
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 OutOfMemoryError : Error
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 SwitchError : Error
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 AssertError will be thrown.
150  *
151  * Params:
152  *  file = The name of the file that signaled this error.
153  *  line = The line number on which this error occurred.
154  */
155 extern (C) void onAssertError( string file, size_t line )
156 {
157     if( assertHandler is null )
158         throw new AssertError( file, line );
159     assertHandler( file, line );
160 }
161
162
163 /**
164  * A callback for assert errors in D.  The user-supplied assert handler will
165  * be called if one has been supplied, otherwise an AssertError will be thrown.
166  *
167  * Params:
168  *  file = The name of the file that signaled this error.
169  *  line = The line number on which this error occurred.
170  *  msg  = An error message supplied by the user.
171  */
172 extern (C) void onAssertErrorMsg( string file, size_t line, string msg )
173 {
174     if( assertHandler is null )
175         throw new AssertError( msg, file, line );
176     assertHandler( file, line, msg );
177 }
178
179
180 ///////////////////////////////////////////////////////////////////////////////
181 // Internal Error Callbacks
182 ///////////////////////////////////////////////////////////////////////////////
183
184
185 /**
186  * A callback for array bounds errors in D.  A RangeError will be thrown.
187  *
188  * Params:
189  *  file = The name of the file that signaled this error.
190  *  line = The line number on which this error occurred.
191  *
192  * Throws:
193  *  RangeError.
194  */
195 extern (C) void onRangeError( string file, size_t line )
196 {
197     throw new RangeError( file, line );
198 }
199
200
201 /**
202  * A callback for finalize errors in D.  A FinalizeError will be thrown.
203  *
204  * Params:
205  *  e = The exception thrown during finalization.
206  *
207  * Throws:
208  *  FinalizeError.
209  */
210 extern (C) void onFinalizeError( ClassInfo info, Exception ex )
211 {
212     throw new FinalizeError( info, ex );
213 }
214
215
216 /**
217  * A callback for hidden function errors in D.  A HiddenFuncError will be
218  * thrown.
219  *
220  * Throws:
221  *  HiddenFuncError.
222  */
223 extern (C) void onHiddenFuncError( Object o )
224 {
225     throw new HiddenFuncError( o.classinfo );
226 }
227
228
229 /**
230  * A callback for out of memory errors in D.  An OutOfMemoryError will be
231  * thrown.
232  *
233  * Throws:
234  *  OutOfMemoryError.
235  */
236 extern (C) void onOutOfMemoryError()
237 {
238     // NOTE: Since an out of memory condition exists, no allocation must occur
239     //       while generating this object.
240     throw cast(OutOfMemoryError) cast(void*) OutOfMemoryError.classinfo.init;
241 }
242
243
244 /**
245  * A callback for switch errors in D.  A SwitchError will be thrown.
246  *
247  * Params:
248  *  file = The name of the file that signaled this error.
249  *  line = The line number on which this error occurred.
250  *
251  * Throws:
252  *  SwitchError.
253  */
254 extern (C) void onSwitchError( string file, size_t line )
255 {
256     throw new SwitchError( file, line );
257 }
258
259
260 /**
261  * A callback for unicode errors in D.  A UnicodeException will be thrown.
262  *
263  * Params:
264  *  msg = Information about the error.
265  *  idx = String index where this error was detected.
266  *
267  * Throws:
268  *  UnicodeException.
269  */
270 extern (C) void onUnicodeError( string msg, size_t idx )
271 {
272     throw new UnicodeException( msg, idx );
273 }