C ++ Windows:将应用程序外部崩溃处理到程序

时间:2018-04-30 19:00:29

标签: c++ c++11 visual-c++ c++14

我有以下功能来执行外部程序:

std::string exec(const char* cmd) {
    char buffer[128];
    std::string result = "";
    FILE* pipe = _popen(cmd, "r");
    if (!pipe) throw std::runtime_error("_popen() failed!");
    try {
        while (!feof(pipe)) {
            if (fgets(buffer, 128, pipe) != NULL)
                result += buffer;
        }
    } catch (...) {
        _pclose(pipe);
        throw;
    }
    _pclose(pipe);
    return result;
}

是否可以通过这种方式将崩溃作为例外处理(我使用dir作为示例,它不会崩溃)?

std::ostringstream ossCmd;
ossCmd << "dir";
std::string cmd = ossCmd.str();

try
{
   std::string str = exec(cmd.c_str());
}
catch(...)
{

}

如果外部应用程序以外部崩溃错误结束,我无法获得异常。示例:“dir已停止工作”

2 个答案:

答案 0 :(得分:1)

这不是&#34;例外&#34 ;;它崩溃了。

你无法发现车祸。

继续进行的方法是在调试器下运行程序。然后,它将为您提供查找,诊断和纠正问题所需的信息。

答案 1 :(得分:0)

由于您在使用Visual C ++的Windows下,您可以使用CreateProcess运行外部程序,并使用GetExitCodeProcess来获取程序的退出状态。

您无法捕获在其他进程中发生的任何异常,但您可以检查GetExitCodeProcess的结果是否有异常值。来自docs

  
      
  • ExitProcess或TerminateProcess函数中指定的退出值。
  •   
  • 流程的主要或WinMain功能的返回值。
  •   
  • 导致进程终止的未处理异常的异常值。
  •   

当然,这假设您无法访问外部程序的来源。如果您有外部程序的源代码,那么您应该在那里调试并修复问题,而不是试图从外部捕获它。