在最新的luajit 2.1.0-beta3上,递归xpcall是否可行?

我正在luajit 2.1.0-beta3中模拟Go的defer/panic/recover,并且能够递归使用xpcall会很不错,因为Go的defer函数本身可能会发生panic,而具有defers的函数经常调用其他具有defers的函数。 我正在尝试这样做:

-- 递归xpcall,它们是否可行? 嗯...看起来我们得到了“错误的错误处理”

ouch=function() error("ouch") end

ouch2=function() error("ouch2") end

ok=function() return "ok" end

h2 = function(err)
   print("panicHandler2运行,错误为:", err) - 嗯,无法调用这个?
end

h = function(err)
   print("panicHandler运行,错误为:", err)
   g = {xpcall(ouch2, h2)}
   for k,v in pairs(g) do print("递归xpcall的g结果为k = ", k,"val = ",v) end
   -- 递归xpcall的g结果为k = 1 val = false
   -- 递归xpcall的g结果为k = 2 val = 错误的错误处理
end

r={xpcall(ouch, h)}

for k,v in pairs(r) do print("最上层xpcall的r结果为k = ", k,"val = ",v) end

-- 输出:

$ luajit
LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/
JIT: ON SSE2 SSE3 SSE4.1 BMI2 fold cse dce fwd dse narrow loop abc sink fuse
> dofile 'rexp.lua'
panicHandler运行,错误为:rexp.lua:3: ouch
递归xpcall的g结果为k =  1 val = false
递归xpcall的g结果为k = 2 val = 错误的错误处理
最上层xpcall的r结果为k = 1 val = false
>

所以,我看到了“错误的错误处理”,而不是调用h2。

是否有方法使递归xpcall工作?

上述代码是在OSX上使用clang构建的,使用了默认的Makefile,并取消注释了XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT。 因此,它是在macOS上进行的C构建,而不是C++构建。

更新:在PUC Lua5.1.5和5.3.4上运行,h2被调用。

点赞