这非常类似于: 将 GetLastError() 变成异常
我还希望能够在错误中添加
std::string
:
class Win32Exception : public std::system_error
{
public:
Win32Exception(std::string ErrorDesc) :
std::system_error(GetLastError(),
std::system_category(),
ErrorDesc)
{
}
};
问题是,至少在 VS2015 的 DEBUG 版本中,
std::string
的构造会重置 GetLastError()
。因此,当 Win32Exception 调用 GetLastError()
时,它总是得到零/无错误。
我可以使用
const char*
,但我也想使用std::wstring
,这意味着我需要将其转换为std::string
或const char*
(因为std::system_error
需要std::string
或const char*
),并且这让我回到了错误被重置的同一问题。
是否有一些优雅的解决方案可以轻松抛出 Win32 错误,让异常类捕获
GetLastError()
并能够使用 std::string
添加任意信息?
您需要重写异常类构造函数,以便它将错误代码作为参数,因此错误代码:
Win32Exception
(
char const * const psz_description
, ::DWORD const error_code = ::GetLastError()
)
: std::system_error(error_code, std::system_category(), psz_description)
{
}