【问题标题】:Suggestions on error handling of Win32 C++ code: AtlThrow vs. STL exceptionsWin32 C++代码错误处理建议:AtlThrow vs. STL异常
【发布时间】:2011-02-21 00:18:46
【问题描述】:

在编写 Win32 C++ 代码时,我希望能得到一些关于如何处理 Win32 API 错误的提示。

尤其是在 Win32 函数调用失败的情况下(例如 MapViewOfFile),最好是:

  1. 使用AtlThrowLastWin32

  2. 定义一个派生自 std::exception 的 Win32Exception 类,并添加一个 HRESULT 数据成员来存储与 GetLastError 返回的值对应的 HRESULT?

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

1 与 2 的优缺点是什么?

还有其他更好的选择吗?

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

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

【问题讨论】:

    标签: c++ winapi error-handling exception


    【解决方案1】:

    AtlThrow 并不是非常有用,它会抛出 CAtlException ,它只是包装了一个错误代码。 MapViewOfFile 失败是一个真正异常的问题,它带有一个低级错误代码,它根本不会告诉您或您的用户实际上出了什么问题。处理错误几乎总是不可能的,你不可能不理会它而不使用 MMF。您必须记录错误并以非常一般的错误终止您的程序。

    在错误消息中提供非常详细的信息通常是浪费精力。 “MyClass::DoSomething() 方法中的 MapViewOfFile 调用失败”对您的用户或她的支持人员根本没有任何意义。不过,这对您来说很好,可以跟踪错误。但是您可以通过使用__FILE____LINE__ 宏轻松地自动执行此操作,而不会遇到本地化问题。将错误与源代码匹配所需的一切。

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

    【讨论】:

      【解决方案2】:

      您不应该使用异常来处理错误。例外是例外。对于 C++ 错误处理,请查看:System error support in C++0x

      【讨论】:

      • 这个链接对于关心错误检查的人来说价值 1K+ 美元,非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2017-05-19
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多