unity-luaFramewrok中lua错误信息的捕获

来源:互联网 发布:网络被屏蔽怎么破解 编辑:程序博客网 时间:2024/05/29 17:22

现有的lua报错有显示 方法调用堆栈,类似 debug.traceback,可能我们有其他需求,要求对错误日志进行收集,然后上传到自己的日志平台,如 sentry
这就要求我们自定义一个错误处理的函数嵌入到lua的调用中


1. 在 Main.lua 中加入错误处理函数 __G__TRACKBACK__

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)    -- errorHandle(errorMessage, msg) -- 日志处理,上传给sentryend

2. 修改LuaState.cs

        public void PCall(int args, int oldTop)        {               int funcIndex = -(args + 1); //其实funcIndex就等价于oldTop反向索引            if (!LuaDLL.lua_isfunction(L, funcIndex))            {                //如果堆栈中funcIndex不是待调用的 函数,则返回                return;            }            int traceback = 0;            //自定义的错误追踪函数在Main.lua中, __G__TRACKBACK__            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); //压入错误处理函数 __G__TRACKBACK__            }            if (LuaDLL.lua_pcall(L, args, LuaDLL.LUA_MULTRET, traceback) != 0)            {                if (traceback != 0)                {                    // 移除错误处理函数 __G__TRACKBACK__ 和 error message,其实不处理也行,反正最后 EndPCall 都会恢复栈顶                    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. 故意报错测试一下

这里写图片描述

0 0
原创粉丝点击