2010-07-18 17 views
5

Cada vez que se produce un error en un script Lua, me gustaría escribir los valores de todas las variables locales y globales en la pantalla/opcionalmente en un archivo, además del seguimiento de la pila habitual.Mejorando los mensajes de error de Lua

¿Cómo podría obtener esto como el comportamiento predeterminado para todos los errores?

Respuesta

3

Si está utilizando el intérprete Lua estándar, reemplace debug.traceback con su propia función. Si está integrando Lua en su programa, use su función de rastreo en lua_pcall.

+0

Gracias, voy a experimentar con sus recomendaciones. Relacionado con esto, veo algunas referencias en listas de correo para "pcall y las corutinas no se llevan bien". Uso coroutines, ¿debería usar coxpcall y copcall? – proFromDover

1

Una solución más adecuada sería usar xpcall en todo el código.

local function myerrhandler (errobj) 
    print(debug.traceback()) 
    for k,v in pairs(_G) do print("GLOBAL:" , k,v) end 
    return false 
end 

xpcall(function() 
--Your code here 
end , myerrhandler) 
0

Su controlador de errores puede sobrescribirse. Si llama a Lua desde C, para imprimir siempre la pila, puede enganchar en la función luaG_errormsg.

En lua, escribir:

local _HandlingError = 0 
function _ErrorHandler (errobj) 
    if(_HandlingError == 0) then 
     _HandlingError = 1 
     local errStr = tostring(errobj) or "" 
     if(type(errobj)=='table') then 
      errStr = "Table: {" .. table.concat(errobj, ',') .. "}" 
     end 
     print("Error: \"" .. errStr .. "\"") 
     --for k,v in pairs(_G) do print("GLOBAL:" , k,v) end 
     if(type(errobj)=='thread') then 
      print(debug.traceback(errobj)) 
     else 
      print(debug.traceback('',2)) 
     end 
     _HandlingError = 0 
    end 
    return false 
end 

Luego, en ldebug.c, añadir a luaG_errormsg después if (! L-> funcerr = 0)

else 
{ 
    lua_getfield(L, LUA_GLOBALSINDEX, "_ErrorHandler"); 
    if (!lua_isfunction(L, -1)) { 
     lua_pop(L, 1); 
    } 
    else { 
     lua_pushvalue(L, 1); 
     lua_call(L, 2, 1); 
     lua_pop(L, 1); 
    } 
} 
2

El El módulo StackTracePlus hace lo que usted desea, mostrando las variables locales en cada nivel del seguimiento de la pila. No descarga toda la tabla global, pero probablemente sea excesiva.

instalarlo con LuaRocks, utilice

luarocks install stacktraceplus 

Luego, en el código, hacer:

local STP = require "StackTracePlus" 
debug.traceback = STP.stacktrace 

En este Lua 5,1 convertirá automáticamente todas las trazas de la pila; para el código de Lua 5.2, debe ajustar su código con xpcall como se sugiere en otras respuestas.

Cuestiones relacionadas