什么可以覆盖main()的返回码?

时间:2012-08-27 01:46:51

标签: c++ exception return-value main

我发生了一件非常奇怪的事情,但我还没有坚持到底。

我有测试用例,它应该捕获错误并从main返回相应的错误代码,但/有时/在测试运行时程序返回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(即没有失败)。

任何人都可以帮助解释可能发生这种情况的情况吗?即,在进程退出之前,main的返回值从非零变为零

这是在Windows 7(x64)上进行的,使用MSVC ++ 2010 Express构建x86(32位)应用程序。我没有在任何其他Windows或Linux平台或编译器上看到这种奇怪的失败,但这并不一定意味着它不会在这些环境中发生。

2 个答案:

答案 0 :(得分:1)

如果您有任何调用atexit的{​​{1}}处理程序,或者析构函数执行此操作的任何静态存储持续时间对象,它可能会解释您所看到的内容。它们在您的exit(0)声明后执行。这是未定义的行为,这可以解释为什么你有时只会看到它。

答案 1 :(得分:0)

也许你没有正确地抛出异常...... 我的意思是从try块中的函数调用或处理完成,你抛出一些其他类型的异常。 尝试为此写一个default catch block