Я думаю, что наиболее подходящим API для обработки сбоев является возвращение второго целочисленного кода ошибки в вашем API, например:
int myfunc(args, int* realReturn);
Возвращаемое значение int является кодом ошибки.
Предыдущийвывод передается как указатель в вызывающем коде:
int myInt;
if (myFunc(args, &myInt) != 0) {
//handle error
}