2010-02-16 3 views
3

현재 프로젝트 (예 : 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 것을 말한다 ... 내가 지금까지있는 것입니다. 루아가 버퍼를 할당합니까? 매뉴얼은 약간 모호합니다.

답변

8

일부 연구 및 일부 RTFS 후에이 문제를 해결했습니다. 나는 완전히 틀린 나무를 짖고 있었다.

Lua API 참조에서 longjmp가 오류 처리에 사용된다고 말하더라도 longjmp 버퍼는 API를 통해 전혀 노출되지 않습니다.

루아 함수에서 오류를 잡으려면 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_StateerrorJmp 필드가 가리키는 struct lua_longjmp의 일부입니다. 이것은 루아 코어 헤더 lstate.h에 정의되어 있습니다. Here의 교차 참조 된 Doxygen입니다.

저는 (저는 루아 전문가가 아닙니다) LUAI_TRY 매크로를 사용해야한다고 생각합니다.

희망이 도움이됩니다.

+1

음, 나는 몇 가지 RTFS을 수행 한 후, 나는 전체 setjmp는/longjmp를 일 루아에서 내부있을 생각이와 잘못 짚었 수 있습니다. 어쩌면 오류는 아직 해결하지 못한 다른 방법으로 처리됩니다. 나는 아직도 조사 중이다. –

+0

OK, 해결했습니다. 오류를 잡으려면 lua_pcall 함수를 사용해야합니다. –