Обработка ошибок в Lua с использованием longjmp - PullRequest
3 голосов
/ 16 февраля 2010

Я встраиваю интерпретатор Lua в свой текущий проект (написан на C ) и ищу пример того, как обрабатывать ошибки. Это то, что я до сих пор ...

if(0 != setjmp(jmpbuffer)) /* Where does this buffer come from ? */
{
   printf("Aargh an error!\n");
   return;
}
lua_getfield(L, LUA_GLOBALSINDEX, "myfunction");
lua_call(L, 0, 0);
printf("Lua code ran OK.\n");

В руководстве просто сказано, что ошибки генерируются с использованием функции longjmp , но longjmp необходим буфер. Должен ли я предоставить это или Lua выделяет буфер? Руководство по этому вопросу немного расплывчато.

Ответы [ 2 ]

9 голосов
/ 16 февраля 2010

После некоторых исследований и некоторых RTFS я решил эту проблему. Я лаю совсем не на том дереве.

Несмотря на то, что в справочнике Lua API говорится, что longjmp используется для обработки ошибок, буфер longjmp вообще не предоставляется через API.

Чтобы поймать ошибку в функции Lua, вам нужно использовать lua_pcall (). Мой пример кода можно переписать так, и это работает:

lua_getfield(L, LUA_GLOBALSINDEX, "myfunction");

if(0 != lua_pcall(L, 0, 0, 0))
   printf("Lua error: %s\n", lua_tostring(L, -1));
else
   printf("Lua code ran OK.\n");
0 голосов
/ 16 февраля 2010

Цепочка буферов перехода является частью поля struct lua_longjmp, на которое указывает поле errorJmp в состоянии для потока struct lua_State. Это определено в заголовке ядра Lua lstate.h. Здесь - это тот же Doxygen с перекрестными ссылками.

Я думаю (я не эксперт по Lua), вы должны использовать макрос LUAI_TRY.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...