4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief Exception public header */
27 #define HH_Exception_ 1
34 #include <boost/preprocessor/repeat.hpp>
35 #include <boost/preprocessor/cat.hpp>
36 #include <boost/utility.hpp>
37 #include <boost/type_traits/is_convertible.hpp>
39 //#include "Exception.mpp"
40 ///////////////////////////////hh.p////////////////////////////////////////
42 /** \defgroup exception Exception classes
44 All exceptions in %senf are derived from senf::Exception. This class adds the possibility to
45 extend the exception description while it is processed:
50 // Some code which might raise an arbitrary senf exception
53 catch (senf::Exception & e) {
54 e << "\handling user " << user;
59 This will add the user information to any %senf exception thrown. The Exception is however not a
60 stream. If you need to do more extensive formating, either use an intermediate string-stream or
61 use <a href="http://www.boost.org/libs/format/doc/format.html">Boost.Format</a>:
67 catch (senf::Exception & e) {
68 e << boost::format("\ncall id 0x%04x@%s") % id % address;
72 senf::SystemException is thrown for all operating system errors (failures which result in the
73 operating system setting the errno value). It is also derived from senf::Exception and can
74 therefore be extended as well.
76 Defining your own exception classes derived from senf::Exception is very simple:
79 struct FooException : public senf::Exception
80 { FooException() : senf::Exception("Foo hit the fan") {} };
83 If SENF is compiled in debug mode (SENF_DEBUG is defined), the exception message will
84 automatically include a stack backtrace. For this to work, you need to add the
85 <tt>-rdynamic</tt> option to all link commands. This feature depends on <tt>gcc</tt> and
91 /** \brief Generic exception base-class
93 Exception is a generic exception base-class which allows the exception to be later extended
94 by catching and re-throwing it (See example in \ref exception).
99 : public std::exception
102 ///////////////////////////////////////////////////////////////////////////
103 ///\name Structors and default members
106 virtual ~Exception() throw();
109 ///////////////////////////////////////////////////////////////////////////
111 virtual char const * what() const throw();
112 std::string const & message() const;
114 void append(std::string text); ///< Extend exception description
115 /**< Adds \a text to the description text. */
118 Exception(std::string const & description = ""); ///< Initialize exception with string
119 /**< \a description is the initial error description
120 string. This should probably be a string constant
121 describing the exception for most derived
128 std::string message_;
131 template <class Exc, class Arg>
132 typename boost::enable_if< boost::is_convertible<Exc*,Exception*>, Exc & >::type
133 operator<<(Exc const & exc, Arg const & arg); ///< Extend exception description
134 /**< Adds \a arg converted to string to the end of the
135 exception description string. This operator allows to
136 use Exception instances like streams. The conversion is
137 performed using <code>boost::lexical_cast</code> and is
138 therefor identical to a streaming operation.
139 \see \ref exception */
143 # define _SENF_EXC_DEBUG_ARGS ,char const * file=0,int line=0
144 # define _SENF_EXC_DEBUG_ARGS_ND ,char const *file,int line
145 # define _SENF_EXC_DEBUG_ARGS_P ,file,line
147 # define _SENF_EXC_DEBUG_ARGS
148 # define _SENF_EXC_DEBUG_ARGS_ND
149 # define _SENF_EXC_DEBUG_ARGS_P
152 /** \brief Exception handling standard UNIX errors (errno)
154 This exception is thrown to signal generic \c errno failures. Normally the \c errno value is
155 automatically taken from the \c errno variable but it may also be specified explicitly:
158 // Standard usage: Take \c errno from environment
159 throw senf::SystemException("::open()")
160 << " while opening configuration file: " << filename;
162 // You may however explicitly specify the errno value
163 throw senf::SystemException("::open()", ENOFILE)
165 // Or leave the location information empty
166 throw senf::SystemException(ENOFILE);
167 throw senf::SystemException();
170 From within SENF (<em>and only there because it depends on the \c SENF_DEBUG symbol</em>),
171 SystemException should be thrown using wrapper macros which add additional information to
172 the exception description:
174 // Standard usage: Take \c errno from environment
175 SENF_THROW_SYSTEM_EXCEPTION()
176 << " while opening configuration file: " << filename;
178 // You may however explicitly specify the errno value
179 throw senf::SystemException("::open()", ENOFILE SENF_EXC_DEBUGINFO)
184 class SystemException : public Exception
187 ///////////////////////////////////////////////////////////////////////////
188 ///\name Structors and default members
191 explicit SystemException(std::string const & descr = "" _SENF_EXC_DEBUG_ARGS);
192 explicit SystemException(int code _SENF_EXC_DEBUG_ARGS);
193 SystemException(std::string const & descr, int code _SENF_EXC_DEBUG_ARGS);
195 virtual ~SystemException() throw();
198 ///////////////////////////////////////////////////////////////////////////
200 int errorNumber() const; ///< Error code (\c errno number)
201 char const * errorString() const; ///< Error string (\c strerror() value)
203 bool anyOf(int c0, int c1=0, int c2=0, int c3=0, int c4=0, int c5=0,
204 int c6=0, int c7=0, int c8=0, int c9=0);
205 ///< \c true, if errorNumber() is one of \a c0 ... \a c9
210 void init(std::string const & descr, int code _SENF_EXC_DEBUG_ARGS_ND);
217 # define SENF_EXC_DEBUGINFO ,__FILE__,__LINE__
219 # define SENF_EXC_DEBUGINFO
222 # define SENF_THROW_SYSTEM_EXCEPTION(desc) throw SystemException(desc SENF_EXC_DEBUGINFO)
226 ///////////////////////////////hh.e////////////////////////////////////////
227 #include "Exception.cci"
228 //#include "Exception.ct"
229 #include "Exception.cti"
236 // c-file-style: "senf"
237 // indent-tabs-mode: nil
238 // ispell-local-dictionary: "american"
239 // compile-command: "scons -u test"
240 // comment-column: 40