7

これは私を一晩中夢中にさせてきました。

class ExceptionImpl;

/**
* Custom Exception.
*/
class Exception : public virtual std::exception
{
  public:
    Exception( const Exception& original );

    Exception( const std::string& message );

    virtual ~Exception( void ) throw( );

    virtual const char* what( void ) const throw( );

  private:
    const std::unique_ptr< ExceptionImpl > m_pimpl;
};

このカスタム例外をライブラリから次のようにスローします

throw Exception( "Error message" );

そしてメインビアでそれをキャッチします

try
{
   regex pattern(R"(a*)");

   Id::set_pattern_validator(pattern);

   assert(false);
}
catch( Exception const& exception )
{
   assert(true);
}

Id::set_pattern_validatorライブラリのIdクラス内の静的メソッドであり、例外のソースです。例外をキャッチするためにできる限りのことを試みましたが、キャッチできません。

catch( Exception )

catch( std::exception )

catch( ... )

Nada!

端末出力は次のとおりです。

「'Exception'what()のインスタンスをスローした後に呼び出された終了:パターンバリデーターは一度設定すると変更できません。トラップを中止してください。」

ヤギを犠牲にすることを除いて、私は次に何を試すべきか途方に暮れています...ヒント/ヒント???

注:main内でカスタム例外をスローした場合、問題なくキャッチできます。

C++0xをサポートするGCCを使用するMacOSX環境。

編集:今のところ解決策は、Linuxベースのシステム(Fedora)で開発を続けることです。現時点では回答を受け付けていません。みんな助けてくれてありがとう。

4

3 に答える 3

7

catch (...)(同じスレッド内の囲んでいる関数で)それを処理しない場合、結局、キャッチされない例外がスローされたことがクラッシュの原因ではありません

(注:例外がスローされて、プログラムがキャッチされたとしてもプログラムが終了する可能性があります。これを行うには、デストラクタからスローするか、throws句に違反する2つの方法があります。)

于 2011-06-25T12:47:02.567 に答える
1

main内からカスタム例外をスローし、それをキャッチできる場合は、コールスタックのどこかにUBを表示している必要があります。これにより、後の例外がキャッチされなくなります。

于 2011-06-25T14:12:29.597 に答える
0

私も同様の問題を抱えていました。

Mac OSX 10.8(Mountain Lion)でgcc47(macports)を使用してQTを使用していました。QTメイン内で、共有ライブラリからメソッドを呼び出し、その共有ライブラリで定義された例外をスローしました。メソッド呼び出しの周りにどのような種類のtry-catchを配置しても(例外のキャッチ、ベースのキャッチ、さらにはcatch(…))、終了ハンドラーが常に呼び出され、プログラムが中止されました。例外をキャッチすることは不可能でした。

まず、リンク中に-shared-libgccオプションを試しました。それ以外の場合は問題ではありませんでした。catch(…)句は機能していました。

次に、共有ライブラリに対してリンクされた手書きのmakefileを使用して、QTなしの単純なメインを作成しました。そしてそれはうまくいきました!

この問題は、gccに渡されたオプションの違い(つまり、QT / qmakeによって生成されたmakefileと私の手書きのmakefileの違い)が原因であると結論付けました。

いくつかのバイナリ検索の後、次のオプションが(リンク中に)問題を引き起こしていることがわかりました。

-mmacosx-version-min=10.5

次のように変更した後:

-mmacosx-version-min=10.6,

すべてが期待どおりに機能していました。

オプションを10.6に指定すると、なぜ問題が解決するのかわかりません。これについて何か考えはありますか?

于 2013-01-31T22:05:35.807 に答える