루아 바인드를 사용하여 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 문이 실행되지 않음을 나타냅니다.
감사합니다.
청크를'lua_pcall' 할 수는 있지만, C++ 예외는 기대할 수 없습니다. Luabind '런타임'은 단순히'what()'예외 메시지를 루아 스택에 넣고'lua_error'를 호출하지 않을까요? 이것이 내가 설명서에서 기대했던 것이며 간단한 테스트에서 발생하는 것입니다. ('luabind :: call_function'을 쓰면 예외가 발생합니다.) –
@Brian : Luabind는 루아 API를 완전히 무효화하지 않습니다. 그것은 단순히 그것의 일부를 감싸고 있습니다. 그러나 Luabind 문자열을 가져와야하는 경우에는'luabind :: from_stack'을 사용하여 스택 항목을'luabind :: object'로 변환 할 수 있습니다. –
고마워요,이 작품! 스크립트에서 오류가 발생하면 원하는대로 내 콜백 함수로 전달됩니다. 또한 오류가 발생하면 호스트 프로그램도 충돌합니다. 여전히 이것을보고 ... – Brian