最近在填新坑, 打算用lua作为脚本语言, 于是选择了luajava来跑脚本.

始终我对lua不熟, 错误是难免的了, 不料luajava居然没有输出错误信息orz(事实上连普通的输出都没找到, 反正我直接写了个print函数…)

既然找不到输出, 那我只好想办法把luajava的错误信息转去调用自己写的print了, 于是我想到了或许可以像Java中的try ... catch ...来拦住错误, 然后用 getStackTrace()之类的方法找到调用栈, 最后输出.

顺着这思路, 我找到了lua的xpcall(<fun:function>, <callback:function>)debug.traceback([errMsg:string]), 前者接受一个函数和一个出现错误时的执行回调函数, 返回执行的成功与否和错误信息, 后者可选地接受一个错误信息, 并返回错误信息和调用栈.

那么剩下的就是把程序本体塞到xpcall中, 这个倒没多少难度:

xpcall(
  -- $str是我传入的程序本体
  function() $str end,
  -- err就是错误信息
  function(err)
    -- _print就是我写的, kotlin的print函数
    _print(debug.traceback(err))
  end)

输出:

输出