2010-05-18 36 views
5

在编写Win32 C++代码时,我会很感激有关如何处理Win32 API错误的一些提示。关于错误处理Win32 C++代码的建议:AtlThrow与STL例外

特别地,在一个Win32函数调用的故障(例如MapViewOfFile)的情况下,是能够更好地:

  1. 使用AtlThrowLastWin32

  2. 限定自std一个Win32Exception类::异常,增加一个HRESULT数据成员来存储对应于由GetLastError返回的值的HRESULT?

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

1对2有什么优点和缺点?

有没有其他更好的选择,我错过了?作为一个方面说明,如果我想本地化我正在开发的组件,我怎么能本地化异常什么()字符串?我正在考虑构建一个表,将由what()返回的原始英文字符串映射到Unicode本地化错误字符串。任何人都可以提出更好的方法?

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

回答

5

AtlThrow并不是非常有用,它会抛出CAtlException,它仅仅包装一个错误代码。有一个MapViewOfFile失败是一个真正特殊的问题,它不会告诉你或你的用户有什么实际出错的低级错误代码。处理这个错误几乎总是不可能的,你不可能摆脱它,只是不使用MMF。你必须记录错误并用一个非常通用的错误终止你的程序。

在错误消息中获取非常详细的内容通常是浪费精力。 “在MyClass :: DoSomething()方法中MapViewOfFile调用失败”对您的用户或她的支持人员根本没有任何意义。非常适合你,但是要追踪错误。但是,您可以使用__FILE____LINE__宏轻松自动执行此操作,而无需本地化问题。你真的需要将错误与源代码相匹配。

保持错误信息简洁快速。对于Windows错误,您需要使用FormatMessage()让Windows生成消息。它会自动被本地化,消息文本被标准化并且很好用。从std :: exception派生是可以的。为自定义消息使用字符串资源ID,以便您可以轻松定位它们。解决what()问题。