【发布时间】:2013-04-06 19:11:32
【问题描述】:
如果我调用一个通过 GetLastError 报告错误的 Win32 函数,例如 RegisterClassEx,我该如何针对该错误抛出 std::system_error?
【问题讨论】:
如果我调用一个通过 GetLastError 报告错误的 Win32 函数,例如 RegisterClassEx,我该如何针对该错误抛出 std::system_error?
【问题讨论】:
【讨论】:
std::system_category() 在 Win32 平台上实现是一场灾难。签出this。对于具有 errno 和本机错误代码的系统,标准中基本上没有规定。
请注意,比较 std::system_category() 类别中的 std::error_code 通常不适用于 std::errc 枚举常量,具体取决于您的供应商。例如
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 可以正常工作。
【讨论】:
ERROR_FILE_NOT_FOUND。其次,只要您使用system_category,即使ERROR_PATH_NOT_FOUND 也可以在Visual C++ 2017(但不是2013)下工作。是的,它只有在使用system_category 而不是generic_category 时才能正常工作。微软让它运行得很好。