API Windows использует механизм GetLastError()
для получения информации об ошибке или ошибке. Я рассматриваю тот же механизм обработки ошибок, поскольку я пишу API для проприетарного модуля. Мой вопрос в том, что лучше ли API возвращать код ошибки напрямую? Имеет ли GetLastError()
какое-либо особое преимущество? Рассмотрим простой пример API Win32 ниже:
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()
не понадобится. Еще один подход может быть следующим. Я буду придерживаться вышеупомянутого API Win32, который является хорошим примером для анализатора этого. Здесь я меняю формат на это (гипотетически).
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 или даже просто функции, поскольку оба они одинаковы?