Fix exception when CreateProcessW fails

This change makes the behavior on Windows consistent with the behavior
on Linux.
This commit is contained in:
Hennadii Stepanov 2023-12-03 23:53:36 +00:00
parent 40cd59c097
commit da162fe5a6
No known key found for this signature in database
GPG Key ID: 410108112E7EA81F

View File

@ -148,7 +148,7 @@ class OSError: public std::runtime_error
{ {
public: public:
OSError(const std::string& err_msg, int err_code): OSError(const std::string& err_msg, int err_code):
std::runtime_error( err_msg + " : " + std::strerror(err_code) ) std::runtime_error( err_msg + ": " + std::strerror(err_code) )
{} {}
}; };
@ -235,16 +235,15 @@ namespace util
} }
#ifdef __USING_WINDOWS__ #ifdef __USING_WINDOWS__
inline std::string get_last_error() inline std::string get_last_error(DWORD errorMessageID)
{ {
DWORD errorMessageID = ::GetLastError();
if (errorMessageID == 0) if (errorMessageID == 0)
return std::string(); return std::string();
LPSTR messageBuffer = nullptr; LPSTR messageBuffer = nullptr;
size_t size = FormatMessageA( size_t size = FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK,
NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&messageBuffer, 0, NULL); (LPSTR)&messageBuffer, 0, NULL);
@ -1554,8 +1553,10 @@ inline void Popen::execute_process() noexcept(false)
&piProcInfo); // receives PROCESS_INFORMATION &piProcInfo); // receives PROCESS_INFORMATION
// If an error occurs, exit the application. // If an error occurs, exit the application.
if (!bSuccess) if (!bSuccess) {
throw OSError("CreateProcessW failed", 0); DWORD errorMessageID = ::GetLastError();
throw CalledProcessError("CreateProcess failed: " + util::get_last_error(errorMessageID), errorMessageID);
}
CloseHandle(piProcInfo.hThread); CloseHandle(piProcInfo.hThread);