Rev Author Line No. Line
178 kaklik 1 #ifndef EXCEPTION_H
2 #define EXCEPTION_H
3  
4 #include <exception>
5 #include <sstream>
6 #include <string>
7  
8 namespace mimas {
9  
10 /** Exception class deriving from std::exception.
11 This class provides a syntax similar to output-streams for convenience.
12 For compability with other libraries it is inheriting the class
13 \c std::exception.
14  
15 Here is an example how to use an instance of this class (by invoking the
16 macro MMERROR):
17 \code
18 void test( int i ) throw (exception)
19 {
20 MMERROR( i > 0, exception, ,
21 "Parameter for method test must be greater than zero (but was "
22 << i << ")." );
23 }
24  
25 int main(void)
26 {
27 try {
28 test( -5 );
29 } catch ( exception &e ) {
30 cerr << e.what() << endl;
31 };
32 return 0;
33 }
34 \endcode
35 Mind that the macro uses a variable with the name \c _e. Make sure, that
36 you don't use this variable-name in any of the macro-arguments!
37  
38 @author Jan Wedekind (jan@wedesoft.de)
39 @date Mon Aug 23 14:37:05 UTC 2004 */
40 class mimasexception: public std::exception
41 {
42 public:
43 /// Constructor.
44 mimasexception(void) {}
45 /// Copy constructor.
46 mimasexception( mimasexception &e ): std::exception( e )
47 { message << e.message.str(); }
48 /// Destructor.
49 virtual ~mimasexception(void) throw() {}
50 ///
51 template< typename T >
52 std::ostream &operator<<( const T &t ) { message << t; return message; }
53 /** Interface for manipulators.
54 Manipulators such as \c std::endl and \c std::hex use these
55 functions in constructs like "mimasexception e; e << std::endl".
56 For more information, see the iomanip header. */
57 std::ostream &operator<<( std::ostream& (*__pf)( std::ostream&) )
58 { (*__pf)( message ); return message; }
59 /// Returns error message (not thread safe).
60 virtual const char* what(void) const throw() {
61 temp = message.str();
62 return temp.c_str();
63 }
64 protected:
65 /// Memory-stream containing the error message.
66 std::ostringstream message;
67 /** Temporary to do null-termination.
68 The method \c what() requires a null-terminated string. */
69 static std::string temp;
70 };
71  
72 };
73  
74 #define MMERROR( condition, class, params, message ) \
75 if ( !( condition ) ) { \
76 class _e params; \
77 _e << message; \
78 throw _e; \
79 };
80  
81 #endif