3

私は、まだ理解できていないという、かなり奇妙な出来事が起こっています。

エラーをキャッチしてメインから適切なエラーコードを返すことになっているテストケースがありますが、テストの実行時に/時々/は、エラーコードがゼロ以外の場合でもプログラムは0を返します。

スローされる例外クラスは次のとおりです。

class exit_request {
public:
    explicit exit_request(int code = 0) : m_code(code) {}
    int code() const { return m_code; }
private:
    int m_code;
};

テストケースコードは次のとおりです。

int main(int argc, char* argv[])
{
    try {
        // Do some test case stuff
        // Eventually, due to the supplied command line arguments,
        // we expect an exit_request() to be thrown from within
        // library code.       
    }
    catch (exit_request& exp) {
        std::cout << "Exit Request:" << exp.code() << std::endl;
        return exp.code();
    }
    catch (std::exception& err) {
        std::cout << "Error: " << err.what() << std::endl;
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

このテストケースの多くの実行では、すべてが期待どおりに機能します。exit_request()例外がスローされ、キャッチされ、exp.code()が出力され(値は2)、プロセスからの戻りコードは2です。

ただし、非常にまれに、exp.code()が2として出力されても、プロセスからの戻りコードが0(つまり失敗なし)になることがあります。

誰かがこれが発生する可能性のある状況を説明するのを手伝ってもらえますか?つまり、メインからの戻り値は、プロセスが終了する前にゼロ以外からゼロに変更されますか?

これは、MSVC ++ 2010Expressを搭載したWindows7(x64)で発生し、x86(32ビット)アプリケーションを構築します。他のWindowsまたはLinuxプラットフォーム、あるいはコンパイラーでこの奇妙な失敗は見たことがありませんが、それは必ずしもそれらの環境で発生しなかったことを意味するわけではありません。

4

2 に答える 2

1

atexitを呼び出すハンドラーがある場合exit(0)、またはデストラクタがそれを行う static-storage-duration オブジェクトがある場合は、表示されている内容を説明できる可能性があります。彼らはあなたのreturn声明の後に実行されます。これは未定義の動作であり、これが時々しか発生しない理由を説明できます。

于 2012-08-27T02:30:55.630 に答える
0

例外を正しくスローしていない可能性があります...つまり、tryブロックで呼び出された関数または実行された処理から、他のタイプの例外をスローしているということです。そのためのデフォルトのcatchブロックを書いてみてください。

于 2012-08-27T01:57:45.677 に答える