如果我调用通过GetLastError报告错误的Win32函数,例如RegisterClassEx,如何为该错误抛出std :: system_error?
答案 0 :(得分:13)
检查GetLastError()
的值
DWORD dwErrVal = GetLastError();
std::error_code ec (dwErrVal, std::system_category());
throw std::system_error(ec, "Exception occurred");
答案 1 :(得分:9)
请注意,比较std::error_code
类别中的std::system_category()
通常不会与std::errc
枚举常量一起使用,具体取决于您的供应商。 E.g。
std::error_code(ERROR_FILE_NOT_FOUND, std::system_category()) != std::errc::no_such_file_or_directory)
某些供应商要求使用std::generic_category()
来实现这一目标。
在MinGW中std::error_code(ERROR_FILE_NOT_FOUND, std::system_category()).message()
不会给你正确的信息。
对于真正可移植且强大的解决方案,我建议将std::system_error
和std::system_category
子类化为windows_error
和windows_category
,并自行实现正确的功能。据报道,YMMV,VS2017可以像人们期望的那样工作。