2012-05-10 7 views
4

私はC++コードを扱うJavaプログラマーであり、例外処理に関する助けが必要です。すべての例外とログ情報を取得する

私は次のような構造でコードを持っている:

try{ 
... 
} 
catch(...) 
{ 
    log("Exception occurred"); 
} 

例外が発生しているが、tryブロックは本当に巨大で、デバッグがオプションではありませんので、私は最小限に私の関連を与えるために、コードを変更する必要があります例外に関する情報

だから私は(私のJavaの知識と協力し、C++のガイドを参照)、既存のcatchブロックの前に、次のcatchブロックを追加しました:

catch(exception e) 
{ 
    log(e.what()); 
} 

しかし、私はまだ古いメッセージを取得しています - 「例外が発生しました」 。 tryブロックのコードには、strncpy, memcpyなどの多くの低レベル関数が含まれています。

なぜcatchブロックが期待どおりに機能しないのですか?何が起こっているのか、どの行にあるのか、Javaが簡単に与えるスタックトレースと同様の情報を得るために何ができるのですか?

+0

"C"には "例外"というものはありません(少なくとも制御フローメカニズムの意味ではありません)。 – Mankarse

+1

@Mankarse、 'std :: exception'はC++標準ライブラリには存在しません。 Shaileshに、gdbを使ってそのような非標準的な例外をデバッグすることができます。 – iammilind

+0

可能な複製[catchブロックからバックトレースを取得](http://stackoverflow.com/questions/4283943/getting-the-backtrace-from-the-catch-block) –

答えて

2

例外がC++例外であるかどうかをデバッグして判断する必要があります。
0などでの除算は、C++でサポートされていない実行時例外であるため、文字通り何でもかまいません。

キャッチオールハンドラは、有効なC++例外を捕捉するだけで、すべての例外(多くの場合があります)ではありません。あなたの新しいcatchブロックが読まなければならないので、

+0

catch-allハンドラから発生した例外に関する情報を取得するにはどうすればよいですか? –

+3

@ShaileshTainwala:あなたはできないので、キャッチオールは避けてください。あなたの問題を隠すだけで解決しません。あなたの最善の策は、デバッグによって何がうまくいかないかを判断することです。 –

+0

@Als:キャッチオールが例外をキャッチしたという質問から私は得ました。 –

2

おそらくこれらの例外はexceptionクラスから派生したものではないためです。 C++では、いずれの型も例外である可能性があります。たとえばstring,intなどです。とにかくexceptionをキャッチしたい場合は、exception &への参照を取得する必要があります。

+0

既存のcatch-allハンドラが例外を捕捉しなかった場合、スローされる例外はC++例外ではありません。 –

4

まず、あなたは、参照(一般のconst)でキャッチする必要があります

try { 

} catch(std::exception const& e) { 
    log(e.what()); 
} catch(...) { 
    log("Exception occurred"); 
} 

を第二に、C++で、あなたは任意の値をスローすることがあります。タイプintの偶数あなたのコードベースにこのようなunsubvy throw文が含まれていると、私はあなたを残念に思います。

あなたはJavaから来たので、誤って値の代わりに(動的に割り当てられた値に)ポインタをスローするthrow new XXXXを使用したかどうかを確認します。 C++ではnewは不要です。

関連する問題