我有一個Visual Studio 2008 C++項目,該項目在出現異常錯誤時使用Win32Exception
類。該Win32Exception
類看起來是這樣的:將GetLastError()轉換爲異常
/// 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
類效果很好它已經被使用,我想知道的是,如果有任何明顯的情況下,這將失敗,我應該知道什麼情況。 。歡迎任何其他陷阱,注意事項或有關改進的一般建議。
請注意,boost代碼庫不適用於此代碼。
如果你想知道,這個類也用於沒有'FormatMessageA'的WindowsMobile。這就是爲什麼它從UNICODE轉換爲ASCII。 – PaulH 2010-12-17 22:12:20