]> git.llucax.com Git - software/druntime.git/blob - src/core/exception.d
The next batch of updates towards D2 support. The lib should be pretty close to...
[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( char[] file, size_t line, char[] 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( char[] 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( char[] file, size_t line )
38     {
39         super( "Assertion failure", file, line );
40     }
41
42     this( char[] msg, char[] 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     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 an out of memory error.
71  */
72 class OutOfMemoryException : Exception
73 {
74     this( char[] file, size_t line )
75     {
76         super( "Memory allocation failed", file, line );
77     }
78
79     string toString()
80     {
81         return msg ? super.toString() : "Memory allocation failed";
82     }
83 }
84
85
86 /**
87  * Thrown on a switch error.
88  */
89 class SwitchException : Exception
90 {
91     this( char[] file, size_t line )
92     {
93         super( "No appropriate switch clause found", file, line );
94     }
95 }
96
97
98 /**
99  * Thrown on a unicode conversion error.
100  */
101 class UnicodeException : Exception
102 {
103     size_t idx;
104
105     this( char[] msg, size_t idx )
106     {
107         super( msg );
108         this.idx = idx;
109     }
110 }
111
112
113 ///////////////////////////////////////////////////////////////////////////////
114 // Overrides
115 ///////////////////////////////////////////////////////////////////////////////
116
117
118 /**
119  * Overrides the default assert hander with a user-supplied version.
120  *
121  * Params:
122  *  h = The new assert handler.  Set to null to use the default handler.
123  */
124 void setAssertHandler( assertHandlerType h )
125 {
126     assertHandler = h;
127 }
128
129
130 ///////////////////////////////////////////////////////////////////////////////
131 // Overridable Callbacks
132 ///////////////////////////////////////////////////////////////////////////////
133
134
135 /**
136  * A callback for assert errors in D.  The user-supplied assert handler will
137  * be called if one has been supplied, otherwise an AssertException will be
138  * thrown.
139  *
140  * Params:
141  *  file = The name of the file that signaled this error.
142  *  line = The line number on which this error occurred.
143  */
144 extern (C) void onAssertError( char[] file, size_t line )
145 {
146     if( assertHandler is null )
147         throw new AssertException( file, line );
148     assertHandler( file, line );
149 }
150
151
152 /**
153  * A callback for assert errors in D.  The user-supplied assert handler will
154  * be called if one has been supplied, otherwise an AssertException will be
155  * thrown.
156  *
157  * Params:
158  *  file = The name of the file that signaled this error.
159  *  line = The line number on which this error occurred.
160  *  msg  = An error message supplied by the user.
161  */
162 extern (C) void onAssertErrorMsg( char[] file, size_t line, char[] msg )
163 {
164     if( assertHandler is null )
165         throw new AssertException( msg, file, line );
166     assertHandler( file, line, msg );
167 }
168
169
170 ///////////////////////////////////////////////////////////////////////////////
171 // Internal Error Callbacks
172 ///////////////////////////////////////////////////////////////////////////////
173
174
175 /**
176  * A callback for array bounds errors in D.  An ArrayBoundsException will be
177  * thrown.
178  *
179  * Params:
180  *  file = The name of the file that signaled this error.
181  *  line = The line number on which this error occurred.
182  *
183  * Throws:
184  *  ArrayBoundsException.
185  */
186 extern (C) void onArrayBoundsError( char[] file, size_t line )
187 {
188     throw new ArrayBoundsException( file, line );
189 }
190
191
192 /**
193  * A callback for finalize errors in D.  A FinalizeException will be thrown.
194  *
195  * Params:
196  *  e = The exception thrown during finalization.
197  *
198  * Throws:
199  *  FinalizeException.
200  */
201 extern (C) void onFinalizeError( ClassInfo info, Exception ex )
202 {
203     throw new FinalizeException( info, ex );
204 }
205
206
207 /**
208  * A callback for out of memory errors in D.  An OutOfMemoryException will be
209  * thrown.
210  *
211  * Throws:
212  *  OutOfMemoryException.
213  */
214 extern (C) void onOutOfMemoryError()
215 {
216     // NOTE: Since an out of memory condition exists, no allocation must occur
217     //       while generating this object.
218     throw cast(OutOfMemoryException) cast(void*) OutOfMemoryException.classinfo.init;
219 }
220
221
222 /**
223  * A callback for switch errors in D.  A SwitchException will be thrown.
224  *
225  * Params:
226  *  file = The name of the file that signaled this error.
227  *  line = The line number on which this error occurred.
228  *
229  * Throws:
230  *  SwitchException.
231  */
232 extern (C) void onSwitchError( char[] file, size_t line )
233 {
234     throw new SwitchException( file, line );
235 }
236
237
238 /**
239  * A callback for unicode errors in D.  A UnicodeException will be thrown.
240  *
241  * Params:
242  *  msg = Information about the error.
243  *  idx = String index where this error was detected.
244  *
245  * Throws:
246  *  UnicodeException.
247  */
248 extern (C) void onUnicodeError( char[] msg, size_t idx )
249 {
250     throw new UnicodeException( msg, idx );
251 }