在Unix中,某些函数调用不承诺清除TypeError: unsupported operand type(s) for +: 'int' and 'dict_values'
,因此您无法通过检查errno
来检测错误,除非您在调用之前自行清除它。 E.g:
errno
在Windows上使用WSAGetLastError()代替errno。成功时,所有WSA功能是否都清除了最后一个错误?或者如果没有,有没有办法手动清除它?如果不是这样,你做什么?
答案 0 :(得分:2)
不,你不需要清除它。如果函数失败,则只调用WSAGetLastError
。
正常模式只是:
if (0 != WSAEventSelect(...))
{
int error = WSAGetLastError();
handle_error(error);
}
else
{
WaitForSingleObject(...);
...
}
您可以调用WSASetLastError
函数,但通常没有理由。
Windows上的大多数功能都是实现的,因此它们只会在失败时设置错误代码。
int WSAWhatever()
{
BOOL success = something() && somethingelse();
if (!success)
{
WSASetLastError(WSASOMETHING);
return SOCKET_ERROR;
}
return 0;
}
Win32中有几个地方您需要使用SetLastError
(GetFileSize
等)清除错误,但如果需要,可在MSDN上的文档中调出。
答案 1 :(得分:2)
这取决于功能。如果您找到一个函数,其文档告诉您在调用函数之前调用WSASetLastError(0)
,那么请执行此操作。
但是,这种情况非常罕见。与Win32错误代码(由GetLastError
和SetLastError
管理)一样,通常的模式是,如果函数指示失败,则只应调用WSAGetLastError
。通常,失败由函数的返回值指示,但这随函数的不同而不同,应调用文档。通常的模式是这样的:
if (!some_function())
{
int err = WSAGetLastError();
// do something with err
}
通常,该函数仅承诺在发生故障时调用WSASetLastError()
。因此,人们犯的错误就是使用WSAGetLastError()
来检查错误。那段代码就像这样:
// don't use this code, it is an anti-pattern
some_function();
int err = WSAGetLastError();
if (err != 0)
// do something with err
}
您必须始终仔细阅读您调用的每个函数的文档,因为使用了很多不同的模式。