Tengo un proyecto de Visual Studio 2008 C++ que utiliza una clase Win32Exception
en los casos en que hay un error excepcional. La clase Win32Exception
se ve así:Convertir GetLastError() en una excepción
/// defines an exception based on Win32 error codes. The what() function will
/// return a formatted string returned from FormatMessage()
class Win32Exception : public std::runtime_error
{
public:
Win32Exception() : std::runtime_error(ErrorMessage(&error_code_))
{
};
virtual ~Win32Exception() { };
/// return the actual error code
DWORD ErrorCode() const throw() { return error_code_; };
private:
static std::string ErrorMessage(DWORD* error_code)
{
*error_code = ::GetLastError();
std::string error_messageA;
wchar_t* error_messageW = NULL;
DWORD len = ::FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
*error_code,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
reinterpret_cast<LPWSTR>(&error_messageW),
0,
NULL);
if(NULL != error_messageW)
{
// this may generate a C4244 warning. It is safe to ignore.
std::copy(error_messageW,
error_messageW + len,
std::back_inserter(error_messageA));
::LocalFree(error_messageW);
}
return error_messageA;
};
/// error code returned by GetLastError()
DWORD error_code_;
}; // class Win32Exception
la clase funciona bien en las situaciones que se ha utilizado en Lo que me gustaría saber es si hay casos obvios en los que se producirá un error que debería tener en cuenta. . Cualquier otro inconveniente, advertencia o sugerencias generales sobre mejoras son bienvenidas.
Tenga en cuenta que la biblioteca de impulso no es una opción para este código.
En caso de que se lo pregunte, esta clase también se usa en WindowsMobile que no tiene' FormatMessageA'. Es por eso que se convierte de UNICODE a ASCII. – PaulH