Является ли GetLastError () своего рода шаблоном дизайна? Это хороший механизм?
Windows APIs использует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 или даже просто из функции, поскольку они оба одинаковы?