3

我发生了一件相当奇怪的事情,我还没有弄清楚。

我有测试用例应该捕获错误并从 main 返回适当的错误代码,但是 /sometimes/ 在测试运行时,即使错误代码不为零,程序也会返回 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的返回值在进程退出之前从非零变为零?

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

4

2 回答 2

1

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

于 2012-08-27T02:30:55.630 回答
0

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

于 2012-08-27T01:57:45.677 回答