我遇到了一个比较奇怪的问题,一直没有想明白。
我有一个测试用例,它应该捕获错误并从主函数返回相应的错误代码。但是,在有些情况下,无论错误代码是否为非零值,程序在测试运行中仍会返回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构建32位应用程序。我没有在我们的其他Windows或Linux平台或编译器上看到这个奇怪的故障,但这并不一定意味着它在这些环境中不能发生。
catch(...)
以确保捕获所有异常。 - Adrian Cornish