gpt4 book ai didi

c++ - Win32 C++代码: AtlThrow vs. STL异常错误处理建议

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:14 30 4
gpt4 key购买 nike

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

特别是,在 Win32 函数调用失败的情况下(例如 MapViewOfFile),是否更好:

  1. 使用 AtlThrowLastWin32

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

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

1对2的优缺点是什么?

我还缺少其他更好的选择吗?

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

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

最佳答案

AtlThrow 不是很有用,它抛出的 CAtlException 只是包装了一个错误代码。 MapViewOfFile 失败是一个非常特殊的问题,它的低级错误代码根本不会告诉您或您的用户到底出了什么问题。处理错误几乎总是不可能的,您不可能对它不屑一顾而不使用 MMF。您必须记录错误并以非常普遍的错误终止您的程序。

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

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

关于c++ - Win32 C++代码: AtlThrow vs. STL异常错误处理建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2859435/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com