最近在填新坑, 打算用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)

輸出:

輸出