【问题标题】:What could be overriding the return code from main()?什么可以覆盖 main() 的返回码?
【发布时间】:2012-08-21 13:18:26
【问题描述】:

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

我有测试用例应该捕获错误并从 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 平台或编译器上看到这种奇怪的故障,但这并不一定意味着它不会在这些环境中发生。

【问题讨论】:

  • 尝试添加catch(...) 以确保您捕获所有异常

标签: c++ exception return-value main


【解决方案1】:

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

【讨论】:

  • 谢谢。可能是这样,我会进一步调查。
  • 嗯不幸的是,我们没有任何活动的 atexit() 函数,这意味着它可能在静态对象析构函数中。我查看了我们代码中最明显的那些,但它们似乎被调用得很好,即使在返回码最终为 0(预计为 2)的运行中也是如此。所以无论如何,我可能在某个地方漏掉了什么。
  • 你可以在内部观察这个吗?使用您的调试器。在ExitProcess 上设置一个断点,看看你是如何到达那里的。
【解决方案2】:

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

【讨论】:

  • 肯定会抛出和捕获正确的异常 - 在 exit_request 的 catch 块中有一个打印,我可以看到它被打印到标准输出。无论如何感谢您的建议。
猜你喜欢
  • 2019-08-29
  • 2018-09-10
  • 2011-12-21
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多