Exception 在g+的catch(…)中查找异常类型的非可移植方法+;

Exception 在g+的catch(…)中查找异常类型的非可移植方法+;,exception,g++,Exception,G++,相关问题: 这个问题不同,因为我不关心可移植性。我对专门为g++编写的代码感兴趣,甚至可能对g++的特定版本(4.6.3)感兴趣。它不会用于生产 我处理的是遗留代码,它有数千个throw语句,可能有数百个throw类型。该代码在近1000台机器上运行,每天捕获大约40次抛出。这是不可重复的 在外层,我可以尝试{/../}catch(…){/*catch it*/},并查看是否引发了异常。但我无法找到异常的类型,更不用说它从何处抛出了 我相信这些信息一定是可用的,因为像下面这样的代码可以工

相关问题:

这个问题不同,因为我不关心可移植性。我对专门为g++编写的代码感兴趣,甚至可能对g++的特定版本(4.6.3)感兴趣。它不会用于生产

我处理的是遗留代码,它有数千个throw语句,可能有数百个throw类型。该代码在近1000台机器上运行,每天捕获大约40次抛出。这是不可重复的

在外层,我可以尝试{/../}catch(…){/*catch it*/},并查看是否引发了异常。但我无法找到异常的类型,更不用说它从何处抛出了

我相信这些信息一定是可用的,因为像下面这样的代码可以工作并打印“Y”:

#包括
使用名称空间std;
结构X{};
结构Y{};
结构Z{};
int main(int,char**){
试一试{
//...
抛出Y();
//...
}捕获(…){
cout以下是我使用的:

#包括
使用std::string;
字符串deMangle(常量字符*常量名称)
{
int status=-1;
char*const dem=\uuucxxabiv1::\uuucxa\udemangle(名称、0、0和状态);
常量字符串ret=status==0?dem:name;
如果(状态==0)
免费(dem);
返回ret;
}
字符串getGenericeExceptionInfo()
{
const std::type_info*t=uuu cxxabiv1::uu cxa_current_exception_type();
char const*name=t->name();
返回deMangle(名称);
}
用法:

catch (...)
  {
    std::cerr << "caught: " << getGenericExceptionInfo() << std::endl;
  }
捕获(…) { 标准:cerr
catch (...)
  {
    std::cerr << "caught: " << getGenericExceptionInfo() << std::endl;
  }