00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "Exception.h"
00021 #include <execinfo.h>
00022 #include <stdlib.h>
00023
00024 #include "Stream.h"
00025 #include "Logger.h"
00026
00027 using namespace std;
00028
00029 namespace mdw
00030 {
00031
00032 Exception::Exception() throw ()
00033 {
00034 init();
00035 }
00036
00037 void Exception::init() throw ()
00038 {
00039 void *trace[32];
00040 char **messages;
00041 int i, trace_size = 0;
00042
00043 trace_size = backtrace (trace, 32);
00044 messages = backtrace_symbols (trace, trace_size);
00045
00046
00047 for (i = 1; i < trace_size; ++i)
00048 {
00049 _stackTrace.push_back (messages[i]);
00050 }
00051
00052 free (messages);
00053 }
00054
00055 Exception::~Exception() throw ()
00056 {
00057 }
00058
00059 Exception::Exception (const Exception& other) throw ()
00060 {
00061 }
00062
00063 Exception::Exception (const std::string &error) throw () : _errorMessage (error)
00064 {
00065 init();
00066 }
00067
00068 void Exception::log()
00069 {
00070 log(Logger::getInstance().getStream());
00071 }
00072
00073 void Exception::log (Stream &s)
00074 {
00075 s << _errorMessage << mdw::endl;
00076
00077 for (vector<string>::iterator aIter = _stackTrace.begin();
00078 aIter != _stackTrace.end();
00079 ++aIter)
00080 {
00081 s << *aIter << mdw::endl;
00082 }
00083 }
00084
00085 const char* Exception::what() const throw ()
00086 {
00087 return _errorMessage.c_str();
00088 }
00089 }