Exception类继承自标准模板库的exception类
#ifndef MUDUO_BASE_EXCEPTION_H //头文件
#define MUDUO_BASE_EXCEPTION_H
#include <muduo/base/Types.h>
#include <exception>
namespace muduo
{
class Exception : public std::exception
{
public:
explicit Exception(const char* what); //两个不同参数的构造函数
explicit Exception(const string& what);
virtual ~Exception() throw(); //析构函数 继承自throw抛出异常函数
virtual const char* what() const throw();
const char* stackTrace() const throw();
private:
void fillStackTrace();
string demangle(const char* symbol);
string message_;
string stack_;
};
}
#endif
.cc文件
#include <muduo/base/Exception.h>
#include <cxxabi.h>
#include <execinfo.h>
#include <stdlib.h>
#include <stdio.h>
using namespace muduo;
Exception::Exception(const char* msg): message_(msg) //构造函数在对象初始化时就会初始化异常的信息
{ fillStackTrace();}
Exception::Exception(const string& msg): message_(msg)
{ fillStackTrace();}
Exception::~Exception() throw ()
{ }
const char* Exception::what() const throw()
{ return message_.c_str();}
const char* Exception::stackTrace() const throw()
{ return stack_.c_str();}
void Exception::fillStackTrace()
{
const int len = 200;
void* buffer[len];
int nptrs = ::backtrace(buffer, len); //栈回溯 保存各个栈帧的地址
char** strings = ::backtrace_symbols(buffer, nptrs);//根据地址,转成相应的函数符号
if (strings)
{
for (int i = 0; i < nptrs; ++i)
{
stack_.append(demangle(strings[i]));
stack_.push_back('\n');
}
free(strings);
}
}
//abi::__cxa_demangle函数的作用:将栈回溯信息转换为标准易读的信息
string Exception::demangle(const char* symbol)
{
size_t size;
int status;
char temp[128];
char* demangled;
//first, try to demangle a c++ name
if (1 == sscanf(symbol, "%*[^(]%*[^_]%127[^)+]", temp)) {
if (NULL != (demangled = abi::__cxa_demangle(temp, NULL, &size, &status))) {
string result(demangled);
free(demangled);
return result;
}
}
//if that didn't work, try to get a regular c symbol
if (1 == sscanf(symbol, "%127s", temp)) {
return temp;
}
//if all else fails, just return the symbol
return symbol;
}
Exception类的定义是为了多线程编程中更好地处理异常,遇到相应的问题能够对其进行处理。