関連する質問:
私は移植性を気にしないので、この質問は異なります。特に g++ のコード、または g++ の特定のバージョン (4.6.3) に興味があります。本番環境では使用されません。
おそらく数百のスローされた型を持つ数千のスローステートメントを持つレガシーコードを扱っています。このコードは、ほぼ 1000 台のマシンで実行され、1 日あたり約 40 回のスローをキャッチします。再現性がありません。
外側のレイヤーで、try { / ... / } 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;
}
}
}
キャッチ(...)でg ++の下で例外タイプを識別するための[非ポータブル|ダーティ|厄介な|醜い] *トリックはありますか?