关于Win32 C+错误处理的建议+;代码:AtlThrow与STL异常 在编写Win32 C++代码时,我将体会到一些关于如何处理Win32 API的错误的提示。

关于Win32 C+错误处理的建议+;代码:AtlThrow与STL异常 在编写Win32 C++代码时,我将体会到一些关于如何处理Win32 API的错误的提示。,c++,winapi,error-handling,exception,C++,Winapi,Error Handling,Exception,特别是,如果Win32函数调用失败(例如MapViewOfFile),是否最好: 使用 定义从std::exception派生的Win32Exception类,并添加一个HRESULT数据成员来存储与返回的值相对应的HRESULT 在后一种情况下,我可以使用what()方法返回详细的错误字符串(例如,“在MyClass::DoSomething()方法中MapViewOfFile调用失败”) 1和2的优缺点是什么 还有其他更好的选择吗 顺便说一下,如果我想本地化我正在开发的组件,如何本地化异常w

特别是,如果Win32函数调用失败(例如MapViewOfFile),是否最好:

  • 使用

  • 定义从std::exception派生的Win32Exception类,并添加一个HRESULT数据成员来存储与返回的值相对应的HRESULT

  • 在后一种情况下,我可以使用what()方法返回详细的错误字符串(例如,“在MyClass::DoSomething()方法中MapViewOfFile调用失败”)

    1和2的优缺点是什么

    还有其他更好的选择吗

    顺便说一下,如果我想本地化我正在开发的组件,如何本地化异常what()字符串?我正在考虑构建一个表,将what()返回的原始英文字符串映射为Unicode本地化错误字符串。有人能提出更好的方法吗


    非常感谢您的见解和建议。

    您不应该将异常用于错误处理。例外是例外。对于C++错误处理,请看:

    ATLoad不是非常有用,它抛出了只包含错误代码的CARLExtExchange。MapViewOfFile失败是一个非常特殊的问题,它的低级错误代码根本无法告诉您或您的用户实际出了什么问题。处理错误几乎总是不可能的,你不可能对它不屑一顾,只是不使用MMF。您必须记录错误,并用一个非常常见的错误终止您的程序

    在错误消息中获得非常详细的信息通常是徒劳的。“在MyClass::DoSomething()方法中MapViewOfFile调用失败”对用户或其支持人员来说根本没有任何意义。不过对你来说太好了,可以追踪错误的原因。但是,通过使用
    \uuuu文件\uuuuuu
    \uuuuu行\uuuuuu
    宏,您可以轻松地实现自动化,而无需本地化问题。您真正需要的是将错误与源代码匹配


    保持错误消息简短、快速。对于Windows错误,您需要使用FormatMessage()让Windows生成消息。它将自动本地化,消息文本标准化,谷歌搜索效果良好。从std::exception派生是可以的。对自定义消息使用字符串资源ID,以便轻松地对其进行本地化。也解决了what()问题。

    对于关心错误检查的人来说,此链接价值1K+美元,非常感谢!