关于Win32 C++代码的错误处理的建议:AtlThrow与STL异常

Emb*_*rog 5 c++ error-handling winapi exception

在编写Win32 C++代码时,我会欣赏一些关于如何处理Win32 API错误的提示.

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

  1. 使用AtlThrowLastWin32

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

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

1比2的优缺点是什么?

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

作为旁注,如果我想本地化我正在开发的组件,我怎么能本地化异常what()字符串?我正在考虑构建一个表,将what()返回的原始英文字符串映射到Unicode本地化的错误字符串中.有谁能建议更好的方法?

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

Han*_*ant 5

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

在错误消息中获得非常详细的信息通常是浪费精力."MyClass :: DoSomething()方法中的MapViewOfFile调用失败"对您的用户或其支持人员来说,根本没有任何意义.不过对你有好处,可以追踪错误.但是,通过使用__FILE____LINE__宏,您可以轻松地自动执行此操作,而不会出现本地化问题.您真正需要将错误与源代码匹配.

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