Что вы считаете "лучшей практикой", когда речь идет об ошибках обработки ошибок последовательным образом в библиотеке C.
Есть два способа, о которых я думал:
Всегда возвращайте код ошибки. Типичная функция будет выглядеть так:
MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize);
Всегда указывается подход указателя ошибок:
int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError);
При использовании первого подхода можно написать такой код, где проверка ошибок непосредственно помещается в вызов функции:
int size;
if(getObjectSize(h, &size) != MYAPI_SUCCESS) {
// Error handling
}
Что выглядит лучше, чем код обработки ошибок здесь.
MYAPIError error;
int size;
size = getObjectSize(h, &error);
if(error != MYAPI_SUCCESS) {
// Error handling
}
Однако, я думаю, что использование возвращаемого значения для возвращаемых данных делает код более читаемым. Очевидно, что во втором примере что-то было записано в переменную размера.
Есть ли у вас какие-либо идеи относительно того, почему я должен предпочесть какой-либо из этих подходов или, возможно, смешивать их или использовать что-то еще? Я не являюсь поклонником глобальных состояний ошибок, поскольку имеет тенденцию делать многопоточное использование библиотеки более болезненным.
EDIT: Особые идеи С++ по этому поводу также будут интересны, если они не будут включать исключения, поскольку это не вариант для меня в данный момент...