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