1

関数が有効な例外リストにない例外をスローした場合の標準的な動作は何ですか? たとえば、このコードを実行すると:

#include <iostream>
#include <cstdlib>

using namespace std;

void NotLegal() throw(char) {
    throw 42;
}

void myunexpected () {
  cout << "exception not in list\n";
  cin.get();
  exit(0);
}

int main()
{
    set_unexpected(myunexpected);

    try {
       NotLegal();
   }
   catch(...) {
       cout << "exception catched";
       cin.get();
   }

   return 0;
}

GCC と Visual Studio C++ コンパイラでは動作が異なります。

  • VS 2010 では、予期しない例外が一般的な例外ハンドラーでキャッチされます。
  • GCCunexpected()では、例外をキャッチする代わりにハンドラー関数が呼び出されます。

この違いはなぜですか?unexpected()MS C++ コンパイラがcallbackを呼び出さないのはなぜですか?

4

2 に答える 2

3

のドキュメントset_unexpectedは、この動作が呼び出されます。

備考

...

C++ 標準でunexpectedは、関数がそのスロー リストにない例外をスローしたときに呼び出される必要があります。現在の実装はこれをサポートしていません。

于 2012-06-19T09:10:52.937 に答える
1

適切なフラグを使用してコンパイルしましたか?Visual Studioには、一部の最適化されたリリースビルドの例外処理をオンにしないというデフォルトがあります。

/cと/EHscが必要です

于 2012-06-19T08:49:33.100 に答える