在我的应用程序中,我们尝试删除boost功能并替换为C ++标准库功能。这里我有一个从getLastError编写的boost :: system :: error_code,并从一个地方抛出。并通过准备错误字符串在另一个地方处理。
void fun()
{
boost::system::error_code ec(GetLastError(), boost::system::system_category());
throw ec;
}
int main()
{
try
{
fun();
}
catch ( boost::system::error_code ec )
{
if (ec == boost::asio::error::operation_aborted)
string strError(ec.message();
}
}
我发现我可以用std :: error_code替换它。但是当我尝试使用示例程序时,我无法获得相同的字符串。我尝试了所有三类std :: error_code。我需要一个替换,它提供完全相同的字符串。
//Returns the last Win32 error, in string format. Returns an empty string if there is no error.
std::string GetLastErrorAsString()
{
//Get the error message, if any.
DWORD errorMessageID = ::GetLastError();
LPSTR messageBuffer = nullptr;
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
std::string message(messageBuffer, size - 3); // Getting rid of trailing characters: ".\r\n"
//Free the buffer.
LocalFree(messageBuffer);
return message;
}
int _tmain(int argc, _TCHAR* argv[])
{
SetLastError(ERROR_OPERATION_ABORTED);
std::error_code er(GetLastError(), std::generic_category());
cout << "STD Generic Error: " << er.message() << endl;
std::error_code sysEr(GetLastError(), std::system_category());
cout << "STD System Error: " << sysEr.message() << endl;
std::error_code ioEr(GetLastError(), std::iostream_category());
cout << "STD I/O Error: " << ioEr.message() << endl;
cout << "STL Error: " << GetLastErrorAsString() << endl;
boost::system::error_code ec(GetLastError(), boost::system::system_category());
cout << "Boost Error: " << ec.message() << endl;
}
输出:
STD Generic Error:未知错误
STD系统错误:操作已取消
STD I / O错误:未知错误
STL错误:由于线程退出或应用程序请求,I / O操作已中止
Boost Error:由于线程退出或应用程序请求,I / O操作已中止