Обработка исключений в 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, которая была разработана, сконструирована и протестирована для этой цели.