2011-08-02 2 views
0

루아 바인드를 사용하여 Lua에 바인딩 한 C++ 프로그램이 있습니다. 나는 현재 루아와 루아 바인드가 루아 스크립트 디버깅을 돕기 위해 제공해야하는 오류 처리 방법을 테스트 중이다. luabind 또는 lua가 구문 오류 및 프로그래밍 실수가 발생할 때 예외를 throw하여 디버깅하고 수정할 수있게하는 것이 목표입니다.C++에서 lua 예외를 catch하지 않음

지금 당장의 문제는 아래의 스크립트가 오류 메시지 나 예외가 발생하지 않고 실행을 중지한다는 것입니다. 따라서 큰 프로그램에서 문제가 어디에서 발생했는지 또는 문제가 처음. 여기

는 관련 단편이다 :

루아 (start.lua)

--complete file shown, this is meant to test the error handling of the C++ program 
print("This is valid") 
print(1234) 
bad_function() 
a = "meow" 
b = 7 
c = a + b 

C++ :

This is valid 
1234 
: 여기
Engine *callbackEngine; 
int theCallback(lua_State *L) //This is so I can use my own function as an 
           //exception handler, pcall_log() 
{ 
    return callbackEngine->pcall_log(L); 
} 

void Engine::Run() 
{ 
    luabind::set_pcall_callback(&theCallback); //my own callback function, 
               //redirects to 
               //pcall_log() below 
try { 
    luaL_dofile(L, "scripts/start.lua"); 
} 
catch(luabind::error &sError) { //This never gets executed, noted by breakpoints 
    theCallback(L); 
} 
//etc...code not shown 

int Engine::pcall_log(lua_State *L) 
{ 
    lua_Debug d; 
    lua_getstack(L,1,&d); 
    lua_getinfo(L, "Sln", &d); 
    lua_pop(L, 1); 
    stringstream ss; 
    ss.clear(); 
    ss.str(""); 
    ss << d.short_src; 
    ss << ": "; 
    ss << d.currentline; 
    ss << ": "; 
    if (d.name != 0) 
    { 
     ss << d.namewhat; 
     ss << " "; 
     ss << d.name; 
     ss << ") "; 
    } 
    ss << lua_tostring(L, -1); 
    logger->log(ss.str().c_str(),ELL_ERROR); 
    return 1; 
} 

실행 출력 인

대신 스크립트 실행이 중지됩니다. 내가 예상했던 예외를 던지기. 루아가 예외를 던지거나 에러를 처리하는 다른 방법을 제어하는 ​​방법이 있습니까? 디버깅 정보를 생성하는 로깅 기능 설정이 있지만 중단 점은 위의 catch 문이 실행되지 않음을 나타냅니다.

감사합니다.

답변

2

그것을하기 위해. Luabind 기능을 사용해야합니다. 그러면 다음과 같이 보일 것입니다 :

+0

청크를'lua_pcall' 할 수는 있지만, C++ 예외는 기대할 수 없습니다. Luabind '런타임'은 단순히'what()'예외 메시지를 루아 스택에 넣고'lua_error'를 호출하지 않을까요? 이것이 내가 설명서에서 기대했던 것이며 간단한 테스트에서 발생하는 것입니다. ('luabind :: call_function'을 쓰면 예외가 발생합니다.) –

+0

@Brian : Luabind는 루아 API를 완전히 무효화하지 않습니다. 그것은 단순히 그것의 일부를 감싸고 있습니다. 그러나 Luabind 문자열을 가져와야하는 경우에는'luabind :: from_stack'을 사용하여 스택 항목을'luabind :: object'로 변환 할 수 있습니다. –

+0

고마워요,이 작품! 스크립트에서 오류가 발생하면 원하는대로 내 콜백 함수로 전달됩니다. 또한 오류가 발생하면 호스트 프로그램도 충돌합니다. 여전히 이것을보고 ... – Brian

2

luaL_dofile()은 Luabind의 일부가 아니므로 Luabind 예외는 기대할 수 없습니다. Luabind 자체가 Lua에서 무언가를 호출 할 때 (pcall() 사용) 설정 한 핸들러가 사용되거나 전달됩니다. luaL_dofile()은 기본 Lua 코드 (L 접미사는 호출을 단순화하는 라이브러리 래퍼로 표시 함)와 일반 C에 포함되어 있으므로 사용자가 직접 오류 처리 (Lua/Luabind의 예외는 정직하게 사용하지 않음)를 수행해야합니다. 요구.

안된하지만, 다음 코드는 코드가 할 것으로 예상 어떻게해야 : 당신이 Luabind 통해 루아 스크립트를로드하려면, 다음 luaL_dofile 또는 다른 일반 루아 기능을 사용할 수 없습니다

if(!luaL_doFile(L, "scripts/start.lua")) 
    theCallback(L); 
관련 문제