2012-08-27 14 views
3

我有一个奇怪的事件发生,我还没有能够坚持。什么可以重写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.

然而,偶尔,进程的返回代码是0(即没有失败) ,即使exp.code()打印为2.

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

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

+1

尝试添加一个catch(...)'以确保捕获所有异常 –

回答

0

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

+0

肯定会抛出并捕获正确的异常 - 在catch_request中有一个print_request,我可以看到它被打印到stdout。无论如何感谢您的建议。 –

1

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

+0

谢谢。这可能是,我会进一步调查。 –

+0

嗯不幸的是,我们没有任何活动的atexit()函数,这意味着它可能在静态对象析构函数中。我查看了代码中最明显的代码,但它们似乎被称为罚款,即使在返回代码最终为0(预计为2)的运行中。无论如何,我可能在某个地方错过了一些东西。 –

+0

你可以观察这个内部?使用你的调试器。在ExitProcess上设置一个断点,看看你如何到达那里。 –

相关问题