Обработка исключений в C - делает попытку поймать работу над функциями

Я пишу библиотеку обработки исключений в C, и я столкнулся с ударом:

#define TRY do{ jmp_buf ex_buf__; switch( setjmp(ex_buf__) ){ case 0:
#define FINALLY break; } default:
#define CATCH(x) break; case x:
#define ETRY } }while(0)
#define THROW(x) longjmp(ex_buf__, x)

В моей текущей реализации try catch throw я не смогу генерировать исключение изнутри метода, вызываемого из блока try, потому что переменная jmp_buf является локальной. Как бы я сделал это возможным? Я думал о глобальной переменной, но это не позволило бы мне иметь вложенные блоки try catch.

2 ответа

Решение

Вам нужно использовать глобальный буфер перехода, потому что он должен быть видимым для ваших "клиентов". Например, вы можете сохранить старый буфер перехода в блоке try и восстановить его после его использования.

В общем, я бы не рекомендовал такой подход вообще. Попытка перестроить функции на язык сопряжена с опасностью, и не в последнюю очередь это будет следующий код:

for ;; { 
  TRY {
    if (someVar) {
      break;
    }
  }
  FINALLY {
    doIt()
  }
  ETRY
}

Используйте стек jmp_buf"S. Или, что еще лучше, используйте существующую библиотеку CII, которая была разработана, сконструирована и протестирована для этой цели.

Другие вопросы по тегам