Windows API使用GetLastError()
机制来检索有关错误或失败的信息。由于我正在为专有模块编写API,因此考虑使用相同的机制来处理错误。我的问题是,直接返回错误代码是否更好?GetLastError()
是否具有任何特定优势?请考虑下面的简单Win32 API示例:
HANDLE hFile = CreateFile(sFile,
GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
DWORD lrc = GetLastError();
if (lrc == ERROR_FILE_EXISTS)
{
// msg box and so on
}
}
我写自己的API时发现,GetLastError()
机制意味着 CreateFile()
必须在所有退出点上设置最后的错误代码。如果有许多退出点且其中一个可能被忽略,这可能有点容易出错。这是如何完成的?是否有某种设计模式可用?另一种选择是向函数提供额外的参数,可以直接填写错误代码,因此不需要单独调用 GetLastError()
。还有一种方法如下所示。我将坚持使用上述示例来进行分析。在这里,我将更改格式(假设)。result = CreateFile(hFile, sFile,
GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
if (result == SUCCESS)
{
// hFile has correct value, process it
}
else if (result == FILE_ALREADY_EXIT )
{
// display message accordingly
return;
}
else if ( result == INVALID_PATH )
{
// display message accordingly.
return;
}
我的终极问题是,从API或者函数中返回错误代码的首选方式是什么,因为它们都是一样的?
switch
语句似乎更为合适。 - MysticialGetLastError()
机制意味着CreateFile()
必须在所有出口点设置最后的错误代码。其实不是这样的。只有在通过返回值告知实际已经被设置了时,你才应该检查GetLastError()
。其他情况下它将是未定义的,并且保留上次设置的值。 - DeannaGetLastError
这样的错误机制很难使用——很容易不一致。 - Frerich Raabe