]> git.llucax.com Git - software/druntime.git/blob - src/core/exception.d
e44392a3e3c50b0f3d77d3acf74df0ce724c26c0
[software/druntime.git] / src / 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 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 hidden function error.
34  */
35 class HiddenFuncException : Exception
36 {
37     this(ClassInfo ci)
38     {
39         super("hidden method called for " ~ ci.name);
40     }
41 }
42
43
44 /**
45  * Thrown on an assert error.
46  */
47 class AssertException : Exception
48 {
49     this( string file, size_t line )
50     {
51         super( "Assertion failure", file, line );
52     }
53
54     this( string msg, string file, size_t line )
55     {
56         super( msg, file, line );
57     }
58 }
59
60
61 /**
62  * Thrown on finalize error.
63  */
64 class FinalizeException : Exception
65 {
66     ClassInfo   info;
67
68     this( ClassInfo c, Exception e = null )
69     {
70         super( "Finalization error", e );
71         info = c;
72     }
73
74     override string toString()
75     {
76         return "An exception was thrown while finalizing an instance of class " ~ info.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 out of memory errors in D.  An OutOfMemoryException will be
221  * thrown.
222  *
223  * Throws:
224  *  OutOfMemoryException.
225  */
226 extern (C) void onOutOfMemoryError()
227 {
228     // NOTE: Since an out of memory condition exists, no allocation must occur
229     //       while generating this object.
230     throw cast(OutOfMemoryException) cast(void*) OutOfMemoryException.classinfo.init;
231 }
232
233
234 /**
235  * A callback for switch errors in D.  A SwitchException will be thrown.
236  *
237  * Params:
238  *  file = The name of the file that signaled this error.
239  *  line = The line number on which this error occurred.
240  *
241  * Throws:
242  *  SwitchException.
243  */
244 extern (C) void onSwitchError( string file, size_t line )
245 {
246     throw new SwitchException( file, line );
247 }
248
249
250 /**
251  * A callback for unicode errors in D.  A UnicodeException will be thrown.
252  *
253  * Params:
254  *  msg = Information about the error.
255  *  idx = String index where this error was detected.
256  *
257  * Throws:
258  *  UnicodeException.
259  */
260 extern (C) void onUnicodeError( string msg, size_t idx )
261 {
262     throw new UnicodeException( msg, idx );
263 }
264
265 /********************************************
266  * Called by the compiler generated code.
267  */
268
269 extern (C) void _d_hidden_func()
270 {   Object o;
271     asm
272     {
273         mov o, EAX;
274     }
275
276     //printf("_d_hidden_func()\n");
277     auto a = new HiddenFuncException(o.classinfo);
278     //printf("assertion %p created\n", a);
279     throw a;
280 }