You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.6 KiB
115 lines
3.6 KiB
//
|
|
// Created by zhaohe on 19-5-21.
|
|
//
|
|
|
|
#include "zexception.hpp"
|
|
#if ENABLE_BACK_WARD
|
|
#include "../utils/backward/backward.hpp"
|
|
#endif
|
|
#include <stdarg.h>
|
|
#include "spdlog/spdlog.h"
|
|
|
|
#include <iostream>
|
|
#include <thread>
|
|
|
|
// #include "zwtimecpp/core/base/interlog/simple_logger.hpp"
|
|
// #include "zwtimecpp/core/exception_handle_center.hpp"
|
|
// #include "zwtimecpp/core/logger/logger.hpp"
|
|
// #include "zwtimecpp/core/system_state.hpp"
|
|
using namespace std;
|
|
using namespace iflytop;
|
|
using namespace core;
|
|
#if ENABLE_BACK_WARD
|
|
using namespace backward;
|
|
#endif
|
|
static shared_ptr<zexception> s_theLastedBaseException;
|
|
void zexception::setLastException(shared_ptr<zexception> e) { s_theLastedBaseException = e; }
|
|
shared_ptr<zexception> zexception::getUnHandledException() {
|
|
if (s_theLastedBaseException && !s_theLastedBaseException->isHasCalledToString()) {
|
|
return s_theLastedBaseException;
|
|
}
|
|
if (s_theLastedBaseException) {
|
|
return s_theLastedBaseException;
|
|
}
|
|
return nullptr;
|
|
}
|
|
zexception::zexception(string description, string stdExceptionTypeinfo, string baseExceptionWhat) {
|
|
initialize(description, stdExceptionTypeinfo, baseExceptionWhat);
|
|
};
|
|
|
|
void zexception::initialize(string description, string stdExceptionTypeinfo, string baseExceptionWhat) {
|
|
#if ENABLE_BACK_WARD
|
|
StackTrace st;
|
|
st.load_here(32);
|
|
Printer p;
|
|
p.object = true;
|
|
p.snippet = true;
|
|
p.color_mode = ColorMode::always;
|
|
p.address = true;
|
|
ostringstream out;
|
|
p.print(st, out);
|
|
#endif
|
|
|
|
this->description = description;
|
|
#if ENABLE_BACK_WARD
|
|
this->stackInfo = out.str();
|
|
#else
|
|
this->stackInfo = "not enable back ward";
|
|
#endif
|
|
this->pthreadId = pthread_self();
|
|
this->stdExceptionWhat = baseExceptionWhat;
|
|
this->stdExceptionTypeinfo = stdExceptionTypeinfo;
|
|
|
|
// setLastException(shared_from_this());
|
|
}
|
|
|
|
zexception::zexception(string description, const std::exception &stdexcep) {
|
|
initialize(description, typeid(stdexcep).name(), stdexcep.what());
|
|
// 这里不能写成
|
|
// zexception(description,typeid(stdexcep).name(),stdexcep.what());
|
|
// 不知道为什么对象的成员变量会被清空
|
|
}
|
|
string zexception::format1024(const char *fmt, ...) {
|
|
char buf[1024] = {0};
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vsnprintf(buf, 1024, fmt, args);
|
|
va_end(args);
|
|
|
|
return string(buf);
|
|
}
|
|
string zexception::toString() const {
|
|
string ret;
|
|
ret +=
|
|
"\n#-----------------------!!!!!CatchException!!!!!----------------------"
|
|
"-------\n";
|
|
ret += "# exception type: " + string(typeid(*this).name()) + "\n";
|
|
ret += "# description: " + this->description + "\n";
|
|
|
|
if (!this->stdExceptionTypeinfo.empty()) ret += "# stdExceptionTypeinfo: " + this->stdExceptionTypeinfo + "\n";
|
|
if (!this->stdExceptionWhat.empty()) ret += "# stdExceptionWhat: " + this->stdExceptionWhat + "\n";
|
|
|
|
string threadInfo;
|
|
|
|
// ret += "#pthreadId: " + CoreSystemState::Instance().get
|
|
//(this->pthreadId) + "\n";
|
|
ret += "# loseInfo: " + to_string(this->loseInfo) + "\n";
|
|
ret += "# stackTrace: \n" + this->stackInfo;
|
|
hasCalledToString = true;
|
|
return ret;
|
|
}
|
|
zexception::~zexception() {
|
|
if (!hasCalledToString) {
|
|
std::cerr << "#Show exception message, because not call "
|
|
"exception->toString before it destroy";
|
|
std::cerr << toString();
|
|
}
|
|
}
|
|
bool zexception::isHasCalledToString() const { return hasCalledToString; }
|
|
const char *zexception::what() const _GLIBCXX_USE_NOEXCEPT {
|
|
// return toString().c_str();
|
|
// 之所以在这里打印log,因为在arm上由系统自动打印的,what()可能会出现乱码.
|
|
spdlog::critical("Catch exception \n{}", toString());
|
|
spdlog::default_logger()->flush();
|
|
return "end";
|
|
}
|