wibble 1.1
exception.h
Go to the documentation of this file.
1// -*- C++ -*-
2#ifndef WIBBLE_EXCEPTION_H
3#define WIBBLE_EXCEPTION_H
4
5/*
6 * Generic base exception hierarchy
7 *
8 * Copyright (C) 2003,2004,2005,2006 Enrico Zini <enrico@debian.org>
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24
25#include <wibble/test.h> // for assert
26#include <exception>
27#include <typeinfo>
28#include <string>
29#include <sstream>
30#include <iterator>
31#include <vector>
32
80namespace wibble {
81namespace exception {
82
84
93
97{
98protected:
99 void (*old)();
100public:
103};
104
105// TODO this needs to be made useful with threading as well
107 static std::vector< std::string > *s_context;
108
109 static std::vector< std::string > &context() {
110 if ( s_context )
111 return *s_context;
112 s_context = new std::vector< std::string >();
113 return *s_context;
114 }
115
116 template< typename O >
117 static void copyContext( O out ) {
118 std::copy( context().begin(), context().end(), out );
119 }
120
121 std::string m_context;
122
123 AddContext( std::string s )
124 : m_context( s )
125 {
126 context().push_back( s );
127 }
128
131 context().pop_back();
132 }
133};
134
137{
138protected:
139 std::vector<std::string> m_context;
140
141public:
143 {
144 AddContext::copyContext( std::back_inserter( m_context ) );
145 }
146
147 Context(const std::string& context) throw ()
148 {
149 AddContext::copyContext( std::back_inserter( m_context ) );
151 }
152
153 void addContext(const std::string& c) throw () { m_context.push_back(c); }
154 std::string formatContext() const throw ()
155 {
156 if (m_context.empty())
157 return "no context information available";
158
159 std::stringstream res;
160 std::copy( m_context.begin(), m_context.end(),
161 std::ostream_iterator< std::string >( res, ", \n " ) );
162 std::string r = res.str();
163 return std::string( r, 0, r.length() - 7 );
164 }
165
166 const std::vector<std::string>& context() const throw ()
167 {
168 return m_context;
169 }
170};
171
173
179class Generic : public std::exception, public Context
180{
181protected:
182 mutable std::string m_formatted;
183
184public:
186 Generic(const std::string& context) throw () : Context(context) {}
187 virtual ~Generic() throw () {}
188
190 virtual const char* type() const throw () { return "Generic"; }
191
193 virtual std::string desc() const throw ()
194 {
195 return "an unspecified problem happened; if you see this message, please report a bug to the maintainer";
196 }
197
205 virtual const std::string& fullInfo() const throw ()
206 {
207 if (m_formatted.empty())
208 m_formatted = desc() + ". Context:\n "
209 + formatContext();
210 return m_formatted;
211 }
212
213 virtual const char* what() const throw () { return fullInfo().c_str(); }
214};
215
218
224class Interrupted : public Generic
225{
226public:
228 Interrupted(const std::string& context) throw () : Generic(context) {}
229
230 virtual const char* type() const throw () { return "Interrupted"; }
231};
232
234
242{
243public:
244 WaitInterrupted(const std::string& context) throw () :
246
247 virtual const char* type() const throw () { return "WaitInterrupted"; }
248};
249
251
254class Consistency : public Generic
255{
256 std::string m_error;
257
258public:
259 Consistency(const std::string& context, const std::string& error = std::string()) throw () :
260 Generic(context), m_error(error) {}
262
263 virtual const char* type() const throw () { return "Consistency"; }
264
265 virtual std::string desc() const throw ()
266 {
267 if (m_error.empty())
268 return "consistency check failed";
269 return m_error;
270 }
271};
272
273struct BadCast : public Consistency
274{
275 BadCast( const std::string &context ) throw()
277 {}
279 virtual std::string typeinfo() const throw() { return "unknown types"; }
280 virtual std::string desc() const throw() {
281 return std::string( "bad cast: " ) + typeinfo();
282 }
283};
284
285#ifndef NO_RTTI
286template< typename From, typename To >
287struct BadCastExt : public BadCast
288{
289 BadCastExt( const std::string &error = std::string() ) throw()
290 : BadCast( error )
291 {}
293 virtual std::string typeinfo() const throw() { return std::string( "from " )
294 + typeid( From ).name()
295 + " to "
296 + typeid( To ).name(); }
297};
298#endif
299
310{
311protected:
312 std::string m_var_desc;
313
314public:
315 OutOfRange(const std::string& var_desc, const std::string& context) throw ()
318
319 virtual const char* type() const throw () { return "OutOfRange"; }
320
322 virtual std::string var_desc() const throw () { return m_var_desc; }
323
324 virtual std::string desc() const throw () { return m_var_desc + " out of range"; }
325};
326
328
343template <class C>
345{
346protected:
350
351public:
355 ValOutOfRange(const std::string& var_desc, C val, C inf, C sup,
356 const std::string& context) throw ()
358 m_val(val), m_inf(inf), m_sup(sup) {}
359
361
362
363 virtual C val() const throw () { return m_val; }
365 virtual C inf() const throw () { return m_inf; }
367 virtual C sup() const throw () { return m_sup; }
369
370 virtual const char* type() const throw ()
371 {
372 return "ValOutOfRange<>";
373 }
374
375 virtual std::string desc() const throw ();
376};
377
379
397{
398protected:
400
401public:
402 System(const std::string& context) throw ();
403 System(int code, const std::string& context) throw ();
404
405 virtual const char* type() const throw () { return "System"; }
406
408 virtual int code() const throw () { return m_errno; }
409
411 virtual std::string desc() const throw ();
412};
413
415
421{
422protected:
423 std::string m_name;
424
425public:
426 File(const std::string& name, const std::string& context) throw () :
427 System(context), m_name(name) {}
428 ~File() throw () {}
429
430 virtual const char* type() const throw () { return "File"; }
431
432 virtual std::string desc() const throw () { return m_name + ": " + System::desc(); }
433};
434
435}
436}
437
438// vim:set ts=4 sw=4:
439#endif
Exception thrown when some consistency check fails.
Definition exception.h:255
Consistency(const std::string &context, const std::string &error=std::string())
Definition exception.h:259
virtual const char * type() const
Get a string tag identifying the exception type.
Definition exception.h:263
virtual std::string desc() const
Get a string describing what happened that threw the exception.
Definition exception.h:265
~Consistency()
Definition exception.h:261
Store context information for an exception.
Definition exception.h:137
std::vector< std::string > m_context
Definition exception.h:139
Context(const std::string &context)
Definition exception.h:147
Context()
Definition exception.h:142
std::string formatContext() const
Definition exception.h:154
void addContext(const std::string &c)
Definition exception.h:153
const std::vector< std::string > & context() const
Definition exception.h:166
Base class for exceptions for file I/O.
Definition exception.h:421
std::string m_name
Definition exception.h:423
virtual std::string desc() const
Get the description of the error code.
Definition exception.h:432
~File()
Definition exception.h:428
virtual const char * type() const
Get a string tag identifying the exception type.
Definition exception.h:430
File(const std::string &name, const std::string &context)
Definition exception.h:426
Base class for all exceptions.
Definition exception.h:180
Generic()
Definition exception.h:185
Generic(const std::string &context)
Definition exception.h:186
virtual const char * type() const
Get a string tag identifying the exception type.
Definition exception.h:190
virtual std::string desc() const
Get a string describing what happened that threw the exception.
Definition exception.h:193
virtual const std::string & fullInfo() const
Format in a string all available information about the exception.
Definition exception.h:205
virtual const char * what() const
Definition exception.h:213
std::string m_formatted
Definition exception.h:182
virtual ~Generic()
Definition exception.h:187
Install an unexpected handler for the duration of its scope.
Definition exception.h:97
~InstallUnexpected()
Definition exception.cpp:81
void(* old)()
Definition exception.h:99
Exception thrown when some long event is interrupted by an external event (like a system call being i...
Definition exception.h:225
Interrupted(const std::string &context)
Definition exception.h:228
Interrupted()
Definition exception.h:227
virtual const char * type() const
Get a string tag identifying the exception type.
Definition exception.h:230
Exception thrown when some value is out of range.
Definition exception.h:310
virtual std::string var_desc() const
Get a short description of the variable that has been checked.
Definition exception.h:322
virtual const char * type() const
Get a string tag identifying the exception type.
Definition exception.h:319
OutOfRange(const std::string &var_desc, const std::string &context)
Definition exception.h:315
virtual std::string desc() const
Get a string describing what happened that threw the exception.
Definition exception.h:324
std::string m_var_desc
Definition exception.h:312
~OutOfRange()
Definition exception.h:317
Base class for system exceptions.
Definition exception.h:397
virtual int code() const
Get the system error code associated to the exception.
Definition exception.h:408
virtual const char * type() const
Get a string tag identifying the exception type.
Definition exception.h:405
virtual std::string desc() const
Get the description of the error code.
int m_errno
Definition exception.h:399
Exception thrown when index checking fails.
Definition exception.h:345
C m_inf
Definition exception.h:348
C m_val
Definition exception.h:347
virtual std::string desc() const
Get the value that caused the index to go out-of-bounds.
virtual C sup() const
Get the maximum allowed value for this index.
Definition exception.h:367
virtual const char * type() const
Get the value that caused the index to go out-of-bounds.
Definition exception.h:370
C m_sup
Definition exception.h:349
virtual C val() const
Get the value that caused the index to go out-of-bounds.
Definition exception.h:363
ValOutOfRange(const std::string &var_desc, C val, C inf, C sup, const std::string &context)
Construct the exception; minBound and maxBound are the bounds of the valid index range (inclusive).
Definition exception.h:355
virtual C inf() const
Get the minimum allowed value for this index.
Definition exception.h:365
Exception thrown when some system wait is interrupted by a signal.
Definition exception.h:242
virtual const char * type() const
Get a string tag identifying the exception type.
Definition exception.h:247
WaitInterrupted(const std::string &context)
Definition exception.h:244
void DefaultUnexpected()
Basic unexpected handler.
Definition exception.cpp:69
Definition amorph.h:17
Definition amorph.h:30
Definition exception.h:106
~AddContext()
Definition exception.h:129
static void copyContext(O out)
Definition exception.h:117
AddContext(std::string s)
Definition exception.h:123
static std::vector< std::string > & context()
Definition exception.h:109
std::string m_context
Definition exception.h:121
static std::vector< std::string > * s_context
Definition exception.h:107
Definition exception.h:288
virtual std::string typeinfo() const
Definition exception.h:293
~BadCastExt()
Definition exception.h:292
BadCastExt(const std::string &error=std::string())
Definition exception.h:289
Definition exception.h:274
BadCast(const std::string &context)
Definition exception.h:275
virtual std::string typeinfo() const
Definition exception.h:279
~BadCast()
Definition exception.h:278
virtual std::string desc() const
Get a string describing what happened that threw the exception.
Definition exception.h:280
#define assert_eq(x, y)
Definition test.h:33