error.hpp
Go to the documentation of this file.
00001 00005 /* Copyright (c) 2005-2011 Taneli Kalvas. All rights reserved. 00006 * 00007 * You can redistribute this software and/or modify it under the terms 00008 * of the GNU General Public License as published by the Free Software 00009 * Foundation; either version 2 of the License, or (at your option) 00010 * any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, but 00013 * WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this library (file "COPYING" included in the package); 00019 * if not, write to the Free Software Foundation, Inc., 51 Franklin 00020 * Street, Fifth Floor, Boston, MA 02110-1301 USA 00021 * 00022 * If you have questions about your rights to use or distribute this 00023 * software, please contact Berkeley Lab's Technology Transfer 00024 * Department at TTD@lbl.gov. Other questions, comments and bug 00025 * reports should be sent directly to the author via email at 00026 * taneli.kalvas@jyu.fi. 00027 * 00028 * NOTICE. This software was developed under partial funding from the 00029 * U.S. Department of Energy. As such, the U.S. Government has been 00030 * granted for itself and others acting on its behalf a paid-up, 00031 * nonexclusive, irrevocable, worldwide license in the Software to 00032 * reproduce, prepare derivative works, and perform publicly and 00033 * display publicly. Beginning five (5) years after the date 00034 * permission to assert copyright is obtained from the U.S. Department 00035 * of Energy, and subject to any subsequent five (5) year renewals, 00036 * the U.S. Government is granted for itself and others acting on its 00037 * behalf a paid-up, nonexclusive, irrevocable, worldwide license in 00038 * the Software to reproduce, prepare derivative works, distribute 00039 * copies to the public, perform publicly and display publicly, and to 00040 * permit others to do so. 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 }; 00195 00196 00199 class ErrorErrno : public Error { 00200 00201 int _ierrno; 00202 00203 public: 00204 00208 ErrorErrno( const ErrorLocation &loc ); 00209 }; 00210 00211 00214 class ErrorUnimplemented : public Error { 00215 00216 public: 00217 00222 ErrorUnimplemented( const ErrorLocation &loc ); 00223 00226 ErrorUnimplemented( const ErrorLocation &loc, const std::string &str ); 00227 }; 00228 00229 00232 class ErrorDim : public Error { 00233 00234 public: 00235 00240 ErrorDim( const ErrorLocation &loc ); 00241 00244 ErrorDim( const ErrorLocation &loc, const std::string &str ); 00245 }; 00246 00247 00250 class ErrorRange : public Error { 00251 00252 public: 00253 00259 ErrorRange( const ErrorLocation &loc, 00260 uint32_t i, uint32_t n, 00261 uint32_t j, uint32_t m ); 00262 00267 ErrorRange( const ErrorLocation &loc, uint32_t i, uint32_t n ); 00268 }; 00269 00270 00273 class SignalHandler { 00274 00275 public: 00276 00277 #ifdef _GNU_SOURCE 00278 00280 static void signal_handler_SIGSEGV( int signum, siginfo_t *info, void *ptr ); 00281 #endif 00282 00285 static void signal_handler_SIGTERM( int signum, siginfo_t *info, void *ptr ); 00286 }; 00287 00288 00289 #endif