2012-09-16 58 views
4

我不知道如何有效地调试脚本。我需要一个像Python一样的堆栈输出,但默认情况下,Lua/C没有这个。我不知道如何启用它。或者简单地说,如何从脚本获取错误输出?在脚本中获取Lua运行时错误

回答

6

您可能正在寻找xpcall和debug.traceback的组合。您可以使用xpcall将它传递一个错误处理和使用debug.traceback获得堆栈跟踪:

function functionThatMayFail() 
    error('Failed') 
end 
local success, result = xpcall(functionThatMayFail, 
    function(err) return debug.traceback(err) end) 
print(success, result) 

这段代码将打印:

false xpcall.lua:2: Failed 
stack traceback: 
    xpcall.lua:6: in function <xpcall.lua:6> 
    [C]: in function 'error' 
    xpcall.lua:2: in function <xpcall.lua:1> 
    [C]: in function 'xpcall' 
    xpcall.lua:5: in main chunk 
    [C]: ? 
+0

它如何处理具有多于1个参数的函数? – ekd123

+0

我正在使用带有匿名函数的xpcall(让它调用其他函数)。它现在正是我想要的。谢谢! – ekd123

+0

有点迟了,但你甚至不需要这个内部函数。 功能functionThatMayFail() 错误( '失败') 结束 当地成功,结果= xpcall(functionThatMayFail,debug.traceback) 打印(成功,结果) [见尼克金门的约LUA好的文档的最后一个例子](http://www.gammon.com.au/scripts/doc.php?lua=xpcall) – DelGurth

0

Lua解释器默认会产生错误输出。例如。 (我介绍了一个错字到这个脚本):

$ lua random.lua 
lua: random.lua:6: attempt to call global 'xists' (a nil value) 
stack traceback: 
    random.lua:6: in main chunk 
    [C]: ? 

你能澄清你想要做什么或可能更好的东西是不会发生,你希望发生在错误输出方面?

+0

这不会为我工作,因为我实现主程序中的函数包装器。它不能在程序本身之外使用。有时候会有太多的错误一起发生,其中大多数很容易解决,所以不必发布。 – ekd123