现有的lua报错有显示 方法调用堆栈,类似 debug.traceback,可能我们有其他需求,要求对错误日志进行收集,然后上传到自己的日志平台,如 sentry
这就要求我们自定义一个错误处理的函数嵌入到lua的调用中
1. 在 Main.lua 中加入错误处理函数 _G__TRACKBACK_
1 2 3 4 5 6 7 8 9
| function __G__TRACKBACK__(errorMessage) local msg = "----- Lua error begin -----\n" msg = msg.."Lua error: " .. tostring(errorMessage) .. "\n" msg = msg..debug.traceback("", 2) msg = msg.."----- Lua error end -----" Debugger.LogError(msg)
end
|
2. 修改LuaState.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| public void PCall(int args, int oldTop) { int funcIndex = -(args + 1); if (!LuaDLL.lua_isfunction(L, funcIndex)) { return; } int traceback = 0;
LuaDLL.lua_getglobal(L, "__G__TRACKBACK__"); if (!LuaDLL.lua_isfunction(L, -1)) { LuaDLL.lua_pop(L, 1); } else { traceback = funcIndex - 1; LuaDLL.lua_insert(L, traceback); }
if (LuaDLL.lua_pcall(L, args, LuaDLL.LUA_MULTRET, traceback) != 0) { if (traceback != 0) { LuaDLL.lua_pop(L, 2); } else { string error = LuaDLL.lua_tostring(L, -1); Exception last = LuaException.luaStack; LuaException.luaStack = null; throw new LuaException(error, last); } } }
public void EndPCall(int oldTop) { LuaDLL.lua_settop(L, oldTop - 1); }
|
3. 故意报错测试一下
