Go to the documentation of this file.00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef ERROR_HPP
00044 #define ERROR_HPP 1
00045
00046
00047 #include "config.h"
00048 #include <string>
00049 #include <cstring>
00050 #include <stdlib.h>
00051 #include <stdint.h>
00052 #include <stdlib.h>
00053 #include <stdio.h>
00054 #include <sstream>
00055 #include <errno.h>
00056 #include <signal.h>
00057
00058
00061 template <class T>
00062 inline std::string to_string( const T& t )
00063 {
00064 std::stringstream ss;
00065 ss << t;
00066 return( ss.str() );
00067 }
00068
00069
00072 #define ERROR_LOCATION ErrorLocation( __FILE__, __LINE__, __func__ )
00073
00074
00082 class ErrorLocation {
00083
00084 const char *_file;
00085 int _line;
00086 const char *_func;
00087
00088 public:
00089
00094 ErrorLocation();
00095
00100 ErrorLocation( const char *file, int line, const char *func );
00101
00104 std::string file( void );
00105
00108 int line( void );
00109
00112 std::string func( void );
00113 };
00114
00115
00121 class ExceptionTracer {
00122
00123 void *_traceaddress[25];
00124 int _tracecount;
00125
00126 public:
00127
00132 ExceptionTracer();
00133
00136 void print_trace( std::ostream &os );
00137 };
00138
00139
00142 class Error : public ExceptionTracer {
00143
00144 ErrorLocation _loc;
00145
00146 protected:
00147
00148 std::string _error_str;
00149
00150 public:
00151
00154 Error();
00155
00158 Error( const std::string &str );
00159
00162 Error( const ErrorLocation &loc );
00163
00167 Error( const ErrorLocation &loc, const std::string &str );
00168
00171 std::string get_error_message( void );
00172
00179 void print_error_message( std::ostream &os, bool traceprint = true );
00180 };
00181
00182
00185 class ErrorNoMem : public Error {
00186
00187 public:
00188
00193 ErrorNoMem( const ErrorLocation &loc );
00194
00197 ErrorNoMem( const ErrorLocation &loc, const std::string &str );
00198 };
00199
00200
00203 class ErrorErrno : public Error {
00204
00205 int _ierrno;
00206
00207 public:
00208
00212 ErrorErrno( const ErrorLocation &loc );
00213 };
00214
00215
00218 class ErrorUnimplemented : public Error {
00219
00220 public:
00221
00226 ErrorUnimplemented( const ErrorLocation &loc );
00227
00230 ErrorUnimplemented( const ErrorLocation &loc, const std::string &str );
00231 };
00232
00233
00236 class ErrorDim : public Error {
00237
00238 public:
00239
00244 ErrorDim( const ErrorLocation &loc );
00245
00248 ErrorDim( const ErrorLocation &loc, const std::string &str );
00249 };
00250
00251
00254 class ErrorRange : public Error {
00255
00256 public:
00257
00263 ErrorRange( const ErrorLocation &loc,
00264 uint32_t i, uint32_t n,
00265 uint32_t j, uint32_t m );
00266
00271 ErrorRange( const ErrorLocation &loc, uint32_t i, uint32_t n );
00272 };
00273
00274
00277 class SignalHandler {
00278
00279 public:
00280
00281 #if defined(_GNU_SOURCE) && defined(HAVE_SIGINFO_T)
00282
00284 static void signal_handler_SIGSEGV( int signum, siginfo_t *info, void *ptr );
00285 #endif
00286
00287 #ifdef HAVE_SIGINFO_T
00288
00290 static void signal_handler_SIGTERM( int signum, siginfo_t *info, void *ptr );
00291 #else
00292
00294 static void signal_handler_SIGTERM( int signum );
00295 #endif
00296 };
00297
00298
00299 #endif
00300