2012-01-06 18 views
2

EDIT:RESOLVED。問題ははるかに良かった - 私はコードの1行でお互いに呼び出された2つの機能を持っていた - どちらもlexical_castがクラッシュしていた。私は、coutがクラッシュ時にバックトレースがなく、ラインをデバッグするときにgdbが間違っていることを示していたので、これを見つけることができたのは面白いことです(と私はdidnもう一人見て、一息)。助けてくれてありがとう!共有ライブラリの例外をブーストする


私はgcc 4.1.2とboost 1.48を使用しています。 (それはが伝播して終了するプログラムを、このキャッチ句はdoesnのないキャストが失敗した

try { 
    boost::lexical_cast<T>(s); 
} 
catch (...) { 
    std::cout << "Caught it" << std::endl; 
    throw; 
} 

が、例外はキャッチされません:私は、テンプレート関数内の共有ライブラリに次のコードを持っていますそれをキャッチしないでください)。 Tlongであり、sstd::stringであり、"234a234"に等しい。 (また、ブーストをラップして、#pragma GCC visibility push(default)に含まれていて、リンク時に-shared-libgccフラグを追加しようとしましたが、何もしませんでした)。

次の2つの場合には例外が捕まるん:

try { 
    throw boost::bad_lexical_cast(); 
} 
catch (...) { 
    std::cout << "Caught it" << std::endl; 
    throw; 
} 

と驚くほど、この1:

try { 
    boost::lexical_cast<T>(s); 
    throw boost::bad_lexical_cast(); 
} 
catch (...) { 
    std::cout << "Caught it" << std::endl; 
    throw; 
} 

どれで何が起こっているかのアイデアやより重要なのは、この問題を解決するには?

+0

をリスト上でこれを見つけましたか?それはあなたの質問に答えることはありませんが、多分それはコンパイラを助けるでしょう。 – Joel

+0

それは助けにはならない:( – eddi

答えて

0

BOOST_NO_EXCEPTIONSがどこかで定義されている場合に起こります。

+0

私は少し不明だったかもしれないが、boost :: bad_lexical_cast例外がスローされ、プログラムは終了するが、その例外はcatchブロックに捕まらない。 – eddi

+0

これは奇妙であるあなたは例外をキャッチしたかどうかを確認するために 'std :: cout'を使用していますか? –

+0

ブレークポイントを設定しようとしましたが、決してそこには到達しませんでした。実際にそれが死ぬときに私は普通のバックトレースを得ることさえできません - 'libgcc'スムースと' ??? ''のフレームのちょうど2つを表示します – eddi

1

は、私は私のマシン上で再現することができませんが、私は、私はテストとして、以下の使用異なるコンパイラ

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00) 

を使用しています:私は次の出力を得る

#include <iostream> 
#include <boost/lexical_cast.hpp> 
#include <string> 
#include <exception> 

using namespace std; 

template<typename T> 
T printLexicalCast(const std::string& s){ 
    T t; 
    try { 
     t = boost::lexical_cast<T>(s); 
     cout << "cast is [" << t << "] from string [" << s << "]" << endl; 
    } 
    catch (const boost::bad_lexical_cast& e) { 
     std::cout << "Caught bad lexical cast with error " << e.what() << std::endl; 
    } 
    catch(...){ 
     std::cout << "Unknown exception caught!" << endl; 
    } 
    return t; 
} 


int main(int argc, char *argv[]) { 

    std::string badString("234a234"); 
    long l1 = printLexicalCast<long>(badString); //exception 


    std::string goodString("123456"); 
    long l2 = printLexicalCast<long>(goodString); 

    return 0; 
} 

Caught bad lexical cast with error bad lexical cast: source type value could not be interpreted as target 
cast is [123456] from string [123456] 

bad_lexical_castキャッチを削除すると、キャッチオールが機能します。

Unknown exception caught! 
cast is [123456] from string [123456] 

これは単なるコンパイラのバグですか?後押し:: bad_lexical_cast&またはSTDをキャッチしないのはなぜ::代わりに例外&Iは、ブースト-ユーザーが

http://boost.2283326.n4.nabble.com/conversion-lexical-cast-doesn-t-throw-td2593967.html

+0

私が理解する限り、これは共有ライブラリのみの問題です。 ライブラリを使用していないときに例外をキャッチできますが、ライブラリにコードを挿入するとそのコードは機能しなくなります。共有ライブラリ[ここ](http://gcc.gnu.org/wiki/Visibility)と[here](http://lists.boost.org/boost-users/2008/09/)の例外についての議論があります。 40268.php)、これらのものは私を助けませんでした。 – eddi

+0

完全性のために、私の実際のコード構造は少し複雑です - 例外は私が使用している別のライブラリで使用されているライブラリの中です。 – eddi

関連する問題