none
Exception Specification でthow()を指定しても例外がそのまま届いてしまう RRS feed

  • 質問

  • 以下のコードを実行すると

    C()

    this is catch(C *c)

    と表示されました。

    #include "stdafx.h"

    class C
    {
    public:
     C()
     {
      printf("C()\n");
     };
    };

    void func2()
    {
     C c;
     throw &c;
    }

    void func() throw()
    {
     func2();
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
     try
     {
      func();
     }
     catch (C *c)
     {
      printf("this is catch(C *c)");
     }
     catch (...)
     {
      printf("this is catch(...)");
     }
     getchar();
     return 0;
    }

    func()の定義にてthrow()と指定しています。これはfunc()ではC++例外出ないということを指定していると思います。しかし実際にはC *の例外はfunc()を通過してmainのcatch (C *c)で捕まえられています。これは開発環境のバグでしょうか。

    Visual Studio 2008 Professional Edition
    Version 9.0.30729.1 SPにて
    プロジェクトの新規作成>Visual C++>Win32>Win32コンソールアプリケーションでプロジェクトを作成しました。
    プロジェクトのプロパティは全てデフォルトのままです。
    (/EHscです)
    Debug BuildにてVisual Studio 2008から実行しました。

    以上よろしくお願い致します。

    2010年4月1日 1:38

回答

  • 残念ながら、Visual C++ の仕様面のドキュメントはほとんど翻訳されていません。
    このため、英文の資料を探すことになります。
    http://msdn.microsoft.com/en-us/library/wfa0edys.aspx

    (時間がないので読んでいません)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク konbanwa 2010年4月2日 1:59
    2010年4月1日 22:54
    モデレータ

すべての返信

  • func2()がthrowしただけではないでしょうか。
    func()が何もthrowしないと宣言されたとしても、
    func()が包含する関数が許可していない例外をスロー
    する可能性があるからという理由では、警告の対象に
    すらならないということですね。多分仕様でしょう。
    void f() throw()
    {   throw 1;  }
    は警告(warning C4297)されますが、コンパイルは通るし
    例外も発生しますしね(vv;)。

    http://msdn.microsoft.com/ja-jp/library/cc440200(VS.71).aspx

    などが参考になるかもしれません(バージョンが違うけど)。

    2010年4月1日 11:16
  • 残念ながら、Visual C++ の仕様面のドキュメントはほとんど翻訳されていません。
    このため、英文の資料を探すことになります。
    http://msdn.microsoft.com/en-us/library/wfa0edys.aspx

    (時間がないので読んでいません)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク konbanwa 2010年4月2日 1:59
    2010年4月1日 22:54
    モデレータ
  • 参考になりました。このコラムは初めてみました。

    ありがとうございました。

     

    2010年4月2日 1:58
  • 教えて頂いたURLに、「throw()と指定された関数(あるいはそこから呼ばれた関数)で例外が発生した場合にはunexpectedは呼ばれずまたその動作は不定である」と書かれていました。

    納得しました。

    ありがとうございました。

     

    2010年4月2日 1:59