【问题标题】:How do you use std::system_error with GetLastError?如何将 std::system_error 与 GetLastError 一起使用?
【发布时间】:2013-04-06 19:11:32
【问题描述】:

如果我调用一个通过 GetLastError 报告错误的 Win32 函数,例如 RegisterClassEx,我该如何针对该错误抛出 std::system_error?

【问题讨论】:

    标签: c++ winapi c++11


    【解决方案1】:

    检查GetLastError()的值

    DWORD dwErrVal = GetLastError();
    std::error_code ec (dwErrVal, std::system_category());
    throw std::system_error(ec, "Exception occurred");
    

    请参阅here 了解error_codehere 了解std::system_error

    【讨论】:

    • 是 generic_category 吗?查看 vc11 实现,它看起来可能应该是 system_category。
    • 谢谢,不知道它存在!
    • 嗯,这似乎对我不起作用。 GetLastError() 返回 ERROR_INVALID_PARAMETER,但 system_error::what 只是简单地说“未知错误”
    • system_error 用于 errno 代码,而不是 Win32 代码。他们是不同的。 newscentral.exsees.com/item/…
    • C++11 中的整个std::system_category() 在 Win32 平台上实现是一场灾难。签出this。对于具有 errno 本机错误代码的系统,标准中基本上没有规定。
    【解决方案2】:

    请注意,比较 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_errorstd::system_category 子类化为windows_errorwindows_category,并自己实现正确的功能。据报道,YMMV、VS2017 可以正常工作。

    【讨论】:

    • 一定有人已经做了这个吧?但我找不到一个:(
    • 我在2017年写作,所以我占了很大的优势。这就是说,你的回答有几个问题。您的第一个示例失败的原因是您应该使用ERROR_FILE_NOT_FOUND。其次,只要您使用system_category,即使ERROR_PATH_NOT_FOUND 也可以在Visual C++ 2017(但不是2013)下工作。是的,它只有在使用system_category 而不是generic_category 时才能正常工作。微软让它运行得很好。
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多