我有以下功能来执行外部程序:
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已停止工作”
答案 0 :(得分:1)
这不是&#34;例外&#34 ;;它崩溃了。
你无法发现车祸。
继续进行的方法是在调试器下运行程序。然后,它将为您提供查找,诊断和纠正问题所需的信息。
答案 1 :(得分:0)
由于您在使用Visual C ++的Windows下,您可以使用CreateProcess
运行外部程序,并使用GetExitCodeProcess
来获取程序的退出状态。
您无法捕获在其他进程中发生的任何异常,但您可以检查GetExitCodeProcess
的结果是否有异常值。来自docs:
- ExitProcess或TerminateProcess函数中指定的退出值。
- 流程的主要或WinMain功能的返回值。
- 导致进程终止的未处理异常的异常值。
当然,这假设您无法访问外部程序的来源。如果您有外部程序的源代码,那么您应该在那里调试并修复问题,而不是试图从外部捕获它。