C ++ Windows: обработка внешнего сбоя приложения в программе - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть следующая функция для выполнения внешней программы:

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 голосов
/ 30 апреля 2018

Поскольку вы находитесь под Windows, используя Visual C ++, вы можете использовать CreateProcess для запуска внешней программы и GetExitCodeProcess для получения статуса завершения программы.

Вы не можете перехватить любое исключение, которое произошло внутри другого процесса, но вы можете проверить результат GetExitCodeProcess для значения исключения. Из документов :

  • Значение выхода, указанное в функции ExitProcess или TerminateProcess.
  • Возвращаемое значение из функции main или WinMain процесса.
  • Значение исключения для необработанного исключения, которое привело к завершению процесса.

Конечно, это предполагает, что у вас нет доступа к источнику внешней программы. Если у вас есть источник внешней программы, вы должны отладить и устранить проблему там, а не пытаться поймать ее извне.

0 голосов
/ 30 апреля 2018

Это не «исключение»; это крах.

Вы не можете поймать аварию.

Чтобы продолжить, запустите вашу программу под отладчиком . Затем он предоставит вам информацию, необходимую для поиска, диагностики и устранения проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...