用法

lua_pcall(lua_State *L,int nargs,int nresults,int errfunc)
  • nargs 参数个数
  • nresults 返回值个数
  • errFunc 错误处理函数,0表示无,表示错误处理函数在栈中的索引

示例

--test.lua
function test(x,y)return x + y
end
lua_loadfile(L,"test.lua");--调用
lua_pushnumber(L,10);   --x 值入栈
lua_pushnumber(L,20);   --y 值入栈
lua_pcall(L,2,1,0);

如果没有错误此时栈顶的值为30

如果运行出错,lua_pcall会返回一个非零的结果,如果指定了错误处理函数会先调用错误处理函数,然后再将错误信息入栈,在将返回结果和错误信息入栈之前会先将函数和参数从栈中移除。错误处理函数必须在被调用函数和其他参数之前入栈

错误处理示例

int oldTop = lua_gettop(L) - nargs - 1;     --函数调用之前的栈顶索引
lua_rawgeti(L,LUA_REGISTRYINDEX,errfunc);   --获取错误堆栈处理函数
lua_insert(L,oldTop + 1);                   --设置错误函数栈索引,错误处理函数必须在被调用函数和其他参数之前入栈
if(lua_pcall(L,nargs,nresults,oldTop + 1) == 0)    -- 运行无误,函数和参数从栈中移除
{lua_remove(L,oldTop + 1);               --errorFunc 出栈
}
else                                        --运行出错,先调用错误处理函数,然后再将错误处理信息入栈
{lua_remove(L,oldTop + 1);               --errorFunc 出栈lua_pop(L,1);                           --抛出异常
}//设置错误堆栈处理函数
lua_pushstdcallcfunction(L,errorFunc_traceback);
errorfunc = luaL_ref(L,LUA_REGISTRYINDEX)public int errorFunc_traceback(lua_State *L)
{if(!lua_isstring(L,1))                      --错误信息不是string类型return 1;                               -- 不做处理lua_getfield(L,LUA_GLOBALSINDEX,"debug")    --获取debug函数,压入栈中if(lua_istable(L,-1)){lua_pop(L,1);return 1;}lua_getfield(L,-1,"traceback");             --获取debug.tracenack函数,压入栈中if(lua_isfunction(L,-1)){lua_pop(L,2);return 1;}lua_pushvalue(L,1);                         -- 传递错误信息lua_pushinteger(L,2);                       -- skip this function and tracebacklua_call(L,2,1);                            -- 调用debug.tracebackreturn 1;
}

lua_pcall详解相关推荐

  1. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  2. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  3. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  4. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  5. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  6. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  7. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  8. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  9. pytorch nn.LSTM()参数详解

    输入数据格式: input(seq_len, batch, input_size) h0(num_layers * num_directions, batch, hidden_size) c0(num ...

最新文章

  1. opencv第三方库JAVA接口,SpringBoot使用OpenCV示例总结
  2. weblogic安全漫谈
  3. ubuntu16.04没有办法使用CRT,或者SSH工具的解决办法
  4. WCF+EF实战系列一
  5. redis各种数据结构在项目中的应用场景
  6. 一个简单的软件测试流程(附带流程详解)流程图
  7. Android11.0 SystemUI 修改下拉菜单快捷键的图标
  8. H7000 DTU 问与答
  9. 如何获取ppt的背景图片
  10. 如何将PDF分成每页单独的PDF?3种PDF拆分的方法
  11. Tomcat服务器的使用
  12. PHP小V脸蛋白线,HPH小v脸蛋白线好不好用?HPH小v脸蛋白线怎么用
  13. 2019年清华计算机系本校保研推免机考题目
  14. 在配置kile5 的时候出现core.o的错误如何解决
  15. cad镜像后标注尺寸数字反了_CAD中文字镜像后倒过来了,怎么办?仅修改一个参数值就搞定了...
  16. 网络趣事 ❀ 为什么人们喜欢机械键盘
  17. 解决CentOS安装VM Tools出现在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools的问题。
  18. 【计算机网络】实验报告一:验证性实验
  19. 华为鸿蒙系统会在哪些手机上更新,那些华为手机可以升级鸿蒙系统!
  20. 无头浏览器(Headless Chrome)的使用

热门文章

  1. mysql5.7查看数据库,【查看和修改mysql5.7端口】
  2. 【Windows7下安装各种版本MySQL】
  3. 长江后浪推前浪,前浪死在沙滩上。本人在沙滩上又死了一回
  4. Windows 程序的生与死----FROM 侯俊杰
  5. 重庆移动大数据平台 实现流量计费可视化
  6. C#同步SQL Server数据库中的数据--数据库同步工具[同步已有的有变化的数据]
  7. Spectral Indices(光谱指数)的一些指标
  8. centos7安装bbr_centos7安装bbr记录
  9. 基于mpc(最优控制)的车辆自适应巡航控制(acc),模型预测控制,通过carsim与matlab联防实现速度与间距控制
  10. 从“央视网”下载视频的方法