gpt4 book ai didi

Lua:如何在没有堆栈跟踪的情况下调用错误

转载 作者:行者123 更新时间:2023-12-04 19:07:41 27 4
gpt4 key购买 nike

我正在使用 Lua 来解析用某种语言编写的脚本(我们称之为 L)并创建可以由例如运行的 Lua 代码LuaJIT。但是为了简化用户的调试,我想将 Lua/LuaJIT 给出的运行时错误映射到 L 文件中的正确行。我通过 xpcalling 创建的 Lua 代码来做到这一点,翻译错误消息和堆栈跟踪,然后使用此消息调用错误。不幸的是,这给了我两个堆栈跟踪,一个由我创建,一个追溯到调用错误的函数。是否有可能摆脱这个堆栈跟踪,或者有什么更好的方法来做到这一点?

local status, err = xpcall(loadedCode, debug.traceback)
if not status then
error(createANewErrorMessageWithPrettyTraceback(err),0)
end

输出:
luajit: ./my/file.name:5: Some error message
stack traceback:
my pretty traceback
stack traceback:
[C]: in function 'error'
./my/file/calling/error.lua:44: in function <./my/file/calling/error.lua:26>
./my-main:16: in main chunk
[C]: at 0x00404180

我知道,例如Moonscript 做了与此类似的事情,但据我所知,他们只是将新的错误消息写入 stderr,然后照常继续,而不是停止我想做的程序。
有可能这样做然后不带参数调用错误,这将使程序失败(实际上我认为是错误失败),但这感觉是一个非常丑陋的解决方案,所以我宁愿保留愚蠢的第二个跟踪比这样做。
PS:我假设标题所要求的实际上不起作用(因为错误只需要两个参数),所以我实际上要问的是如何实现这样的事情。 (是否还有其他函数可以做类似的事情,或者我应该在哪里寻找自己编写该函数的方法。)
编辑:是否可以像使用 debug.traceback 一样编辑错误用于获取其回溯的函数?

最佳答案

我想做类似的事情(仅直接来自 Lua),结果我覆盖了 debug.traceback函数本身来更改堆栈跟踪以满足我的需要。我的代码如下;看看这个方法是否也适合你:

  local dtraceback = debug.traceback
debug.traceback = function (...)
if select('#', ...) >= 1 then
local err, lvl = ...
if err and type(err) ~= 'thread' then
local trace = dtraceback(err, (lvl or 2)+1)
if genv.print == iobase.print then -- no remote redirect
return trace
else
genv.print(trace) -- report the error remotely
return -- don't report locally to avoid double reporting
end
end
end
-- direct call to debug.traceback: return the original.
-- debug.traceback(nil, level) doesn't work in Lua 5.1
-- (http://lua-users.org/lists/lua-l/2011-06/msg00574.html), so
-- simply remove first frame from the stack trace
return (dtraceback(...):gsub("(stack traceback:\n)[^\n]*\n", "%1"))
end

关于Lua:如何在没有堆栈跟踪的情况下调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20547499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com