将GetLastError()转换为异常

Pau*_*ulH 5 c++ error-handling exception

我有一个Visual Studio 2008 C++项目,Win32Exception在出现异常错误的情况下使用类.这个Win32Exception类看起来像这样:

/// 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
Run Code Online (Sandbox Code Playgroud)

该课程在其使用的情况下运作良好.我想知道的是,如果有任何明显的情况会导致失败,我应该知道.欢迎任何其他陷阱,警告或改进的一般建议.

请注意,升级库不是此代码的选项.

Bil*_*eal 5

请注意,如果抛出back_inserter原因std::bad_alloc,则内部分配的内存FormatMessage会泄露.