1

関連する質問:

私は移植性を気にしないので、この質問は異なります。特に 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 ++の下で例外タイプを識別するための[非ポータブル|ダーティ|厄介な|醜い] *トリックはありますか?

4

1 に答える 1

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;
  }
于 2012-12-13T21:48:07.413 に答える