Emb*_*rog 5 c++ error-handling winapi exception
在编写Win32 C++代码时,我会欣赏一些关于如何处理Win32 API错误的提示.
特别是,如果Win32函数调用失败(例如MapViewOfFile),最好是:
定义从std :: exception派生的Win32Exception类,添加了HRESULT数据成员来存储与GetLastError返回的值对应的HRESULT ?
在后一种情况下,我可以使用what()方法返回详细的错误字符串(例如" 在MyClass :: DoSomething()方法中调用MapViewOfFile失败. ").
1比2的优缺点是什么?
我还缺少其他更好的选择吗?
作为旁注,如果我想本地化我正在开发的组件,我怎么能本地化异常what()字符串?我正在考虑构建一个表,将what()返回的原始英文字符串映射到Unicode本地化的错误字符串中.有谁能建议更好的方法?
非常感谢您的见解和建议.
AtlThrow并不是非常有用,它会抛出CAtlException,它只包含一个错误代码.让MapViewOfFile失败是一个真正特殊的问题,它有一个低级别的错误代码,它根本不会告诉您或您的用户实际上出了什么问题.处理错误几乎总是不可能的,你不可能耸耸肩而不是使用MMF.您将必须记录错误并终止程序,并出现非常一般的错误.
在错误消息中获得非常详细的信息通常是浪费精力."MyClass :: DoSomething()方法中的MapViewOfFile调用失败"对您的用户或其支持人员来说,根本没有任何意义.不过对你有好处,可以追踪错误.但是,通过使用__FILE__和__LINE__宏,您可以轻松地自动执行此操作,而不会出现本地化问题.您真正需要将错误与源代码匹配.
保持错误消息简短和快速.对于Windows错误,您将需要使用FormatMessage()让Windows生成消息.它将自动进行本地化,消息文本标准化并且谷歌搜索得很好.从std :: exception派生是可以的.将字符串资源ID用于自定义消息,以便您可以轻松对其进行本地化.解决了what()问题.