Является ли 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 или даже просто из функции, поскольку они оба одинаковы?

Ответы на вопрос(7)

Ваш ответ на вопрос