【发布时间】:2012-02-24 09:05:11
【问题描述】:
Windows API 使用GetLastError() 机制来检索有关错误或失败的信息。我正在考虑使用与为专有模块编写 API 相同的机制来处理错误。我的问题是 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()。另一种方法可以如下。我将坚持使用上面的 Win32 API,这是分析这一点的好例子。在这里,我将格式更改为此(假设)。
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语句似乎更合适。 -
为什么不使用异常?
-
据我了解,您问的是通过返回码处理错误是否是个好主意。好吧,我更喜欢异常,它们使错误处理更加舒适。检查this question。
-
“在我编写自己的 API 时,我意识到 GetLastError() 机制意味着 CreateFile() 必须在所有退出点设置最后一个错误代码。”不是这样。如果您已被告知(通过返回值)它实际上已被设置,您应该只检查
GetLastError。在所有其他时间,它将是未定义的,无论它上次设置为什么。 -
@Deanna:一个很好的例子说明为什么
GetLastError风格的错误机制使用起来很痛苦——它很容易不一致。
标签: c++ winapi design-patterns coding-style mfc