2

私はVC2010を使用しており、次のコードを書いて「set_unexpected」機能をテストしています。

#include <iostream>
#include <exception>

void my_unexpected_handler()
{
    std::cout << "unexpected handler" << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    set_unexpected(my_unexpected_handler);

    throw 1;

    return 0;
}

ただし、「my_unexpected_handler」は呼び出されません (文字列はコンソールに出力されません。my_unexpected_handler にブレークポイントを設定しようとしましたが、実行されませんでした)。

コードの何が問題になっていますか?

ありがとう


申し訳ありませんが、予期しない例外を誤解していました。ただし、コードを次のように変更しても

#include <iostream>
#include <exception>

void my_unexpected_handler()
{
    std::cout << "unexpected handler" << std::endl;
}

void func() throw(int)
{
    throw 'h';
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::set_unexpected(my_unexpected_handler);

    func();

    return 0;
}

それはまだ動作しませんか?つまり、「my_unexpected_handler」は呼び出されません。

4

2 に答える 2

3

あなたはおそらく何も悪いことをしていません。Visual Studio 2010を使用していて、そのコンパイラは例外仕様をサポートしていません。まあ、それはそれらを使用してコードを構文チェックしますが、実行時に例外タイプをチェックしません。

http://msdn.microsoft.com/en-us/library/wfa0edys(v=vs.100).aspxを参照してください

例外仕様は一般に有用でないと見なされ、実際にはc ++ 11標準では非推奨になっているため、これは一般に問題とは見なされません。

于 2012-06-17T07:47:28.347 に答える
1

例外をスローする関数には指定がないためthrow、例外が予想されます。予期しない例外ハンドラーは、論理的には、予期しない例外のみを処理します。この例外を予期しないものにするものは何もありません。

于 2012-06-17T04:35:26.853 に答える