相关问题:
这个问题不同,因为我不关心可移植性。我对专门针对g ++的代码感兴趣,甚至可能对g ++(4.6.3)的特定版本感兴趣。它不会用于生产。
我处理的遗留代码有数千个throw语句,可能有数百种抛出类型。此代码在近1000台机器上运行,每天捕获大约40次。这是不可重复的。
在外层,我可以尝试{/ >。 /} catch(...){/ *抓住它* /}并看到抛出异常。但是我无法找到异常的类型,更不用说抛出它的位置了。
我相信信息必须是可用的,因为以下代码可以打印并打印" Y":
#include <iostream>
using namespace std;
struct X {};
struct Y {};
struct Z {};
int main(int, char **) {
try {
//...
throw Y();
//...
} catch (...) {
cout << "Caught unknown" << endl;
try {
throw;
} catch (const X &x) {
cout << "X" << endl;
} catch (const Y &y) {
cout << "Y" << endl;
} catch (const Z &z) {
cout << "Z" << endl;
}
}
}
在catch(...)中用g ++标识异常类型是否有[非便携式|脏|丑陋] *技巧?
答案 0 :(得分:3)
以下是我使用的内容:
#include <cxxabi.h>
using std::string;
string deMangle(const char* const name)
{
int status = -1;
char* const dem = __cxxabiv1::__cxa_demangle(name, 0, 0, &status);
const string ret = status == 0 ? dem : name;
if (status == 0)
free(dem);
return ret;
}
string getGenericExceptionInfo()
{
const std::type_info* t = __cxxabiv1::__cxa_current_exception_type();
char const* name = t->name();
return deMangle(name);
}
用法:
catch (...)
{
std::cerr << "caught: " << getGenericExceptionInfo() << std::endl;
}