2010-02-16 2 views
3

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

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 выделяет буфер? Руководство немного расплывчато.

ответ

8

После некоторых исследований и некоторых 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"); 
-1

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

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

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

+1

Ммм, я мог бы быть ложное дерево с этим, после того, как делают некоторый RTFS, я думаю, что вся setjmp/longjmp вещь может быть внутренней в Lua. Возможно, ошибки обрабатываются каким-то другим способом, с которыми я еще не справился. Я все еще расследую. –

+0

ОК, я решил. Мне нужно использовать функцию lua_pcall, если я хочу поймать ошибки. –

Смежные вопросы