4 * \brief Base exceptions
5 * \ingroup l4cxx_exceptions
8 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
9 * Alexander Warg <warg@os.inf.tu-dresden.de>
10 * economic rights: Technische Universität Dresden (Germany)
12 * This file is part of TUD:OS and distributed under the terms of the
13 * GNU General Public License 2.
14 * Please see the COPYING-GPL-2 file for details.
16 * As a special exception, you may use this file as part of a free software
17 * library without restriction. Specifically, if other files instantiate
18 * templates or use macros or inline functions from this file, or you compile
19 * this file and link it with other files to produce an executable, this
20 * file does not by itself cause the resulting executable to be covered by
21 * the GNU General Public License. This exception does not however
22 * invalidate any other reasons why the executable file might be covered by
23 * the GNU General Public License.
28 #include <l4/cxx/l4types.h>
29 #include <l4/cxx/basic_ostream>
30 #include <l4/sys/err.h>
31 #include <l4/sys/capability>
35 * \defgroup l4cxx_exceptions C++ Exceptions
40 #ifndef L4_CXX_NO_EXCEPTION_BACKTRACE
41 # define L4_CXX_EXCEPTION_BACKTRACE 20 ///< Number of instruction pointers in backtrace
44 #if defined(L4_CXX_EXCEPTION_BACKTRACE)
45 #include <l4/util/backtrace.h>
52 * \addtogroup l4cxx_exceptions
56 * \brief Back-trace support for exceptions.
57 * \headerfile l4/cxx/exceptions
59 * This class holds an array of at most #L4_CXX_EXCEPTION_BACKTRACE
60 * instruction pointers containing the call trace at the instant when an
61 * exception was thrown.
63 class Exception_tracer
65 #if defined(L4_CXX_EXCEPTION_BACKTRACE)
67 void *_pc_array[L4_CXX_EXCEPTION_BACKTRACE];
72 * \brief Create a back trace.
75 Exception_tracer() throw() : _frame_cnt(0) {}
77 Exception_tracer() throw() : _frame_cnt(l4util_backtrace(_pc_array, L4_CXX_EXCEPTION_BACKTRACE)) {}
82 * \brief Get the array containing the call trace.
84 void const *const *pc_array() const throw() { return _pc_array; }
86 * \brief Get the number of entries that are valid in the call trace.
88 int frame_count() const throw() { return _frame_cnt; }
92 * \brief Create a back trace.
94 Exception_tracer() throw() {}
98 * \brief Get the array containing the call trace.
100 void const *const *pc_array() const throw() { return 0; }
102 * \brief Get the number of entries that are valid in the call trace.
104 int frame_count() const throw() { return 0; }
109 * \brief Base class for all exceptions, thrown by the L4Re framework.
110 * \headerfile l4/cxx/exceptions
112 * This is the abstract base of all exceptions thrown within the
113 * L4Re framework. It is basically also a good idea to use it as base of
114 * all user defined exceptions.
116 class Base_exception : public Exception_tracer
119 /// Create a base exception.
120 Base_exception() throw() {}
124 * Return a human readable string for the exception.
126 virtual char const *str() const throw () = 0;
129 virtual ~Base_exception() throw () {}
133 * \brief Exception for an abstract runtime error.
134 * \headerfile l4/cxx/exceptions
136 * This is the base class for a set of exceptions that cover all errors
137 * that have a C error value (see #l4_error_code_t).
139 class Runtime_error : public Base_exception
147 * Create a new Runtime_error.
149 * \param err_no Error value for this runtime error.
150 * \param extra Description of what was happening while the error occured.
152 explicit Runtime_error(long err_no, char const *extra = 0) throw ()
160 for (; i < sizeof(_extra) && extra[i]; ++i)
161 _extra[i] = extra[i];
162 _extra[i < sizeof(_extra) ? i : sizeof(_extra) - 1] = 0;
165 char const *str() const throw ()
166 { return l4sys_errtostr(_errno); }
169 * Get the description text for this runtime error.
171 * \return Pointer to the description string.
173 char const *extra_str() const { return _extra; }
174 ~Runtime_error() throw () {}
177 * Get the error value for this runtime error.
179 * \return Error value.
181 long err_no() const throw() { return _errno; }
185 * \brief Exception signalling insufficient memory.
186 * \headerfile l4/cxx/exceptions
188 class Out_of_memory : public Runtime_error
191 /// Create an out-of-memory exception.
192 explicit Out_of_memory(char const *extra = "") throw()
193 : Runtime_error(-L4_ENOMEM, extra) {}
195 ~Out_of_memory() throw() {}
200 * \brief Exception for duplicate element insertions.
201 * \headerfile l4/cxx/exceptions
203 class Element_already_exists : public Runtime_error
206 explicit Element_already_exists(char const *e = "") throw()
207 : Runtime_error(-L4_EEXIST, e) {}
208 ~Element_already_exists() throw() {}
212 * \brief Exception for an unknown condition.
213 * \headerfile l4/cxx/exceptions
215 * This error is usually used when a server returns an unknown return state
216 * to the client, this may indicate incompatible messages used by the client
219 class Unknown_error : public Base_exception
222 Unknown_error() throw() {}
223 char const *str() const throw() { return "unknown error"; }
224 ~Unknown_error() throw() {}
229 * \brief Exception for a failed lookup (element not found).
230 * \headerfile l4/cxx/exceptions
232 class Element_not_found : public Runtime_error
235 explicit Element_not_found(char const *e = "") throw()
236 : Runtime_error(-L4_ENOENT, e) {}
240 * \brief Indicates that an invalid object was invoked.
241 * \headerfile l4/cxx/exceptions
243 * An Object is invalid if it has L4_INVALID_ID as server L4 UID,
244 * or if the server does not know the object ID.
246 class Invalid_capability : public Base_exception
253 * \brief Create an Invalid_obejct exception for the Object o.
254 * \param o The object that caused the server side error.
256 explicit Invalid_capability(Cap<void> const &o) throw() : _o(o) {}
257 template< typename T>
258 explicit Invalid_capability(Cap<T> const &o) throw() : _o(o.cap()) {}
259 char const *str() const throw() { return "invalid object"; }
262 * \brief Get the object that caused the error.
263 * \return The object that caused the error on invocation.
265 Cap<void> const &cap() const throw() { return _o; }
266 ~Invalid_capability() throw() {}
270 * \brief Error conditions during IPC.
271 * \headerfile l4/cxx/exceptions
273 * This exception encapsulates all IPC error conditions of L4 IPC.
275 class Com_error : public Runtime_error
279 * \brief Create a Com_error for the givel L4 IPC error code.
280 * \param err The L4 IPC error code (l4_ipc... return value).
282 explicit Com_error(long err) throw() : Runtime_error(err) {}
284 ~Com_error() throw() {}
288 * \brief Access out of bounds.
290 class Bounds_error : public Runtime_error
293 explicit Bounds_error(char const *e = "") throw()
294 : Runtime_error(-L4_ERANGE, e) {}
295 ~Bounds_error() throw() {}
302 operator << (L4::BasicOStream &o, L4::Base_exception const &e)
304 o << "Exception: " << e.str() << ", backtrace ...\n";
305 for (int i = 0; i < e.frame_count(); ++i)
306 o << L4::n_hex(l4_addr_t(e.pc_array()[i])) << '\n';
313 operator << (L4::BasicOStream &o, L4::Runtime_error const &e)
315 o << "Exception: " << e.str() << ": ";
317 o << e.extra_str() << ": ";
318 o << "backtrace ...\n";
319 for (int i = 0; i < e.frame_count(); ++i)
320 o << L4::n_hex(l4_addr_t(e.pc_array()[i])) << '\n';