If I call a Win32 function that reports errors via GetLastError, for example RegisterClassEx, how do I throw a std::system_error for that error?
std::system_error is the type of the exception thrown by various library functions (typically the functions that interface with the OS facilities, e.g. the constructor of std::thread) when the exception has an associated std::error_code, which may be reported.
The GetLastError function returns the calling thread's last-error code value.
From the GetLastError() documentation: "To obtain an error string for system error codes, use the FormatMessage() function.". See the Retrieving the Last-Error Code example on MSDN.
C++ perror() The perror() function in C++ prints the error message to stderr based on the error code currently stored in the system variable errno.
Check on the value of GetLastError()
like
DWORD dwErrVal = GetLastError();
std::error_code ec (dwErrVal, std::system_category());
throw std::system_error(ec, "Exception occurred");
See here for error_code
and here for std::system_error
.
Be aware that comparing a std::error_code
in the category of std::system_category()
doesn't generally work with the std::errc
enumeration constants depending on your vendor. E.g.
std::error_code(ERROR_FILE_NOT_FOUND, std::system_category()) != std::errc::no_such_file_or_directory)
Certain vendors require using std::generic_category()
for that to work.
In MinGW std::error_code(ERROR_FILE_NOT_FOUND, std::system_category()).message()
won't give you the correct message.
For a truly portable and robust solution I would recommend subclassing both std::system_error
and std::system_category
to windows_error
and windows_category
and implement the correct functionality yourself. YMMV, VS2017 has been reported to work as one would expect.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With