Является ли GetLastError () своего рода шаблоном проектирования? Это хороший механизм?

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

19
задан Mysticial 1 February 2012 в 17:06
поделиться