【发布时间】:2013-04-18 06:58:47
【问题描述】:
相关问题:
- Determining exception type after the exception is caught?
- How can I determine the current exception in a catch (...) block?
这个问题有所不同,因为我不关心可移植性。我对专门用于 g++ 甚至特定版本的 g++ (4.6.3) 的代码感兴趣。它不会在生产中使用。
我正在处理具有数千个 throw 语句以及可能有数百个抛出类型的遗留代码。这段代码在近 1000 台机器上运行,每天捕获大约 40 次抛出。不可重复。
在外层,我可以尝试一下 { /.../ } catch (...) { /* catch it */ } 并看到抛出了异常。但是我一直找不到异常的类型,更不用说它是从哪里抛出的了。
我相信信息必须是可用的,因为像下面这样的代码可以工作并打印“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;
}
}
}
是否有任何 [non-portable|dirty|nasty|ugly]* 技巧可以在 catch (...) 中识别 g++ 下的异常类型?
【问题讨论】: