5

私は C++ コードを扱う Java プログラマーであり、例外処理の助けが必要です。

次の構造のコードがあります。

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

例外が発生していますが、try ブロックは非常に大規模であり、デバッグはオプションではないため、例外に関する関連情報を提供するためにコードを最小限に変更する必要があります。

そのため、既存の catch ブロックの前に次の catch ブロックを追加しました (私の Java の知識と C++ ガイドを参照して作業します)。

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

ただし、「例外が発生しました」という古いメッセージがまだ表示されます。strncpy, memcpytry ブロック内のコードには、などの低レベル関数が多数含まれています。

このcatchブロックが期待どおりに機能しないのはなぜですか? Javaが簡単に提供するスタックトレースと同様に、発生している例外とその行に関する情報を取得するにはどうすればよいですか。

4

3 に答える 3

6

まず、参照 (通常は const) によってキャッチする必要があるため、新しいcatchブロックは次のようになります。

try {

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

次に、C++ では任意の値をスローできます。タイプでもint。あなたのコードベースにそのような無知なthrowステートメントが含まれている場合、私はあなたを気の毒に思います。

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

于 2012-05-10T08:04:05.777 に答える
3

おそらく、これらの例外はexceptionクラスから派生していないためです。stringC++ では、 、 など、任意の型が例外になる可能性がありますint。とにかく、キャッチしたいexception場合は、おそらくexception &.

于 2012-05-10T07:27:55.637 に答える
2

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

catch-all ハンドラーは、すべての例外ではなく、有効な C++ 例外のみをキャッチします (十分な数になる可能性があります)。

于 2012-05-10T07:28:21.160 に答える