如何不退出程序而捕获堆栈信息

我正在运行一系列测试并收集每个测试的一些元数据。如果其中一项测试中出现错误,我想保存堆栈信息,但不想退出脚本。例如:

-- 示例程序

for _, v in ipairs(tests) do
     -- 检查函数调用的一些结果
  if v == nil then
     -- error("function X failed") no exit
     -- 将堆栈信息保存到变量/文件中
     -- 继续执行程序
  end
 end

我目前不知道在 Lua 中是否可能告诉函数 error() 在创建堆栈跟踪后不要停止。对此有何想法?

点赞
用户4984564
用户4984564

debug.traceback 就是你正在寻找的。你可以编写一个函数,1. 获取回溯信息 2. 打开一个文件 3. 将回溯信息写入文件 4. 关闭文件。

在这种情况下,你必须使用级别为 2,因为 0 是 debug.traceback 函数,1 是调用它的函数(即你的函数),2 是调用那个函数的函数。message 可以是你的错误代码。然后,你只需在本地覆盖 error 函数,完成后调用 error 将仅记录错误而不退出程序。

EDIT:你也可以全局覆盖 error,但如果发生某些代码(你没有编写自己的代码)出现严重错误并且程序仍然持续运行,这可能导致意外的结果。

你可以更好地使用这样的结构:

if os.getenv 'DEBUG' then
  my_error = function()
    -- what I explained above
  end
else
  my_error = error
end

只需在所有通常使用 error 的地方使用 my_error 即可。

2018-08-17 12:07:20