2010-07-18 14 views
5

Ogni volta che si verifica un errore in uno script Lua, mi piacerebbe che scrivesse i valori di tutte le variabili locali e globali sullo schermo/facoltativamente su un file, oltre alla consueta traccia dello stack.Miglioramento dei messaggi di errore Lua

Come è possibile ottenere che questo sia il comportamento predefinito per tutti gli errori?

risposta

3

Se si utilizza l'interprete standard Lua, sostituire debug.traceback con la propria funzione. Se stai incorporando Lua nel tuo programma, utilizza la funzione traceback in lua_pcall.

+0

Grazie, proverò con i tuoi consigli. In relazione a questo, vedo alcuni riferimenti sulle mailing list a "pcall e coroutine non vanno d'accordo". Uso le coroutine, dovrei usare coxpcall e copcall? – proFromDover

1

Una soluzione più appropriata sarebbe quella di utilizzare xpcall per tutto il codice.

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

Il gestore errori può essere sovrascritto. Se chiami Lua da C, per stampare sempre lo stack puoi collegarti alla funzione luaG_errormsg.

in Lua, scrivere:

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 

Poi nel ldebug.c, aggiungere luaG_errormsg dopo if (! L-> errfunc = 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

Il Il modulo StackTracePlus fa quello che vuoi, visualizzando le variabili locali a ogni livello della traccia dello stack. Non scarica l'intera tabella globale, ma probabilmente è eccessivo.

per installarlo con LuaRocks, utilizzare

luarocks install stacktraceplus 

Poi nel codice, fare:

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

In Lua 5.1 questo converte automaticamente tutte le tracce di stack; per il codice Lua 5.2 è necessario avvolgere il proprio codice con uno xpcall come suggerito in altre risposte.

Problemi correlati