Есть ли лучший способ обработки ошибок в стиле C.

Я пытаюсь изучить C, написав простой анализатор / компилятор. До сих пор это был очень поучительный опыт, однако из-за сильного опыта в C # у меня возникли некоторые проблемы с настройкой - в частности, из-за отсутствия исключений.

Теперь я прочитал Более чистый, более элегантный и труднее распознать , и я согласен с каждым словом в этой статье; В моем коде на C # я стараюсь по возможности не генерировать исключения, однако теперь, когда я столкнулся с миром, в котором я не могу генерировать исключения, моя обработка ошибок полностью затмевает чистую и легкую для чтения логику. моего кода.

В настоящий момент я пишу код, который должен быстро выходить из строя , если есть проблема, а также потенциально глубоко вложен - я остановился на шаблоне обработки ошибок, согласно которому " Функции Get возвращают NULL в случае ошибки, а другие функции возвращают -1 в случае ошибки. В обоих случаях функция, которая терпит неудачу, вызывает NS_SetError () , поэтому все, что нужно сделать вызывающей функции, - это очистить и немедленно вернуться в случае сбоя.

Моя проблема заключается в том, что число если (Действие () утверждения, которые у меня есть, делают мне голову - это очень повторяющееся и полностью затемняет лежащую в основе логику. В итоге я создал себе простой макрос, чтобы попытаться улучшить ситуацию, например:

#define NOT_ERROR(X)    if ((X) < 0) return -1

int NS_Expression(void)
{
    NOT_ERROR(NS_Term());
    NOT_ERROR(Emit("MOVE D0, D1\n"));

    if (strcmp(current->str, "+") == 0)
    {
        NOT_ERROR(NS_Add());
    }
    else if (strcmp(current->str, "-") == 0)
    {
        NOT_ERROR(NS_Subtract());
    }
    else
    {
        NS_SetError("Expected: operator");
        return -1;
    }
    return 0;
}

Каждая из функций NS_Term , NS_Add и NS_Subtract выполните NS_SetError () и верните -1 в случае ошибки - его лучше , но все равно кажется, что я злоупотребляю макросами и не » t допускают любую очистку (некоторые функции, в частности функции Get , которые возвращают указатель, являются более сложными и требуют запуска кода очистки).

В целом кажется, что меня просто не хватает что-то - несмотря на то, что такую ​​обработку ошибок якобы легче распознать, во многих моих функциях я ' m действительно пытается определить, правильно ли обрабатываются ошибки:

  • Некоторые функции возвращают NULL при ошибке
  • Некоторые функции возвращают при ошибке
  • Некоторые функции никогда не вызывают ошибки
  • Мои функции выполняют NS_SetError () , но многие другие функции - нет.

Есть ли лучший способ структурировать свои функции, или все остальные тоже есть эта проблема?

Также есть Get функции (которые возвращают указатель на объект), возвращающие NULL при ошибке, хорошая идея, или это просто сбивает с толку мою ошибку обработки?

11
задан Justin 15 April 2011 в 13:22
поделиться