2013-08-11 2 views
4

Я работаю над программой (C++, с D3D9) и Lua. Я уже реализовал LUA Api, и все работает нормально, кроме обработки ошибок. Я много googled, и я нашел решение, которое обрабатывает большинство ошибок. Я пишу это из-за других ошибок.C++ Lua Обработка ошибок

Я покажу вам соответствующий код на фотографиях.

Code Part 1 (LUA)

Code Part 2 (LUA)

Part 3 (Console Output)

Теперь самые важные функции: PerformCall() и LuaErrorReport()

Part 4 (C++) Part 5 (PerformCall)

Однако, как Я уже говорил: некоторые ошибки обрабатываются. Но этого нет.

ответ

3

Некоторые мысли о том, что может быть неправильным. Вы передаете L за lua_pcall, а LuaErrorReport вместо этого принимает State(). Они могут работать с разными lua_State, которые могут произойти, как в контексте сопрограммы. Если это преднамеренно, по крайней мере, укажите, почему это делается.

lua_pushvalue внутри LuaErrorReport также выглядит подозрительно. Как вы знаете, что нижнее значение в стеке содержит сообщение, которое вы сообщаете? Эта функция вызывается из других функций, которые могут накапливать больше значений в стеке. Я бы либо изменить, что

lua_pushvalue(L, -3); 

или

lua_pushstring(L, msg); 

Наконец, следует также с учетом прохождения debug.traceback как функции ошибки в lua_pcall получить сообщение об ошибке более значимое StackTrace. Что-то вроде:

void LUA::PerformCall(int return_amount) 
{ 
    lua_getglobal(L, "debug"); 
    lua_getfield(L, -1, "traceback"); 
    lua_remove(L, -2); 
    int errindex = -p_iArgCount - 2; 
    lua_insert(L, errindex); 
    int error = lua_pcall(L, p_iArgCount, return_amount, errindex); 
    // ... 

И избавиться от debug.trace вызова в LuaErrorReport.

+0

Эй, спасибо за ответ. Весь код находится в классе LUA, который имеет частный член lua_State * L. Он также имеет публичную функцию lua_State * State(), которая возвращает L. Я не думаю, что это вызывает ошибку. Завтра я попробую отдохнуть. – Freakyy

+1

Я проверил код и все работает сейчас. Большое спасибо. – Freakyy

+0

У меня есть другой вопрос. Когда ошибка обрабатывается функцией обработки ошибок, происходит ошибка (ее спам консоли). Любой способ остановить это? – Freakyy

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