lua_pcall与lua_call之间的区别
lua_pcall与lua_call之间的区别
定义:
void lua_call (lua_State *L, int nargs, int nresults);
int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
这两个api的前三个参数含义一样,只是lua_pcall在保护模式(protection mode)下调用函数。
在调用不出错的情况下,这两个函数的行为一模一样,但是lua_pcall有处理调用出错的能力,其处理方法主要取决于第四个参数 errfunc, 如果errfunc为0,则lua_pcall直接把错误信息通过lua_pushstring压栈,然后返回;然后errfunc不为0,则自动调用(L, errfunc)(errmsg),errmsg表示原始出错信息。
通常,使用errfunc输出一些额外的出错信息,比如stack traceback,这些信息在lua_pcall返回之后不能再得到。
lua_pcall的返回值:
- LUA_ERRRUN: a runtime error.
- LUA_ERRMEM: memory allocation error. For such errors, Lua does not call the error handler function.
- LUA_ERRERR: error while running the error handler function.
下面给出了一个例子,来说明lua_pcall errfunc的工作原理:
luapcall.lua
function printmsg()
--故意制造调用出错
printaa("hello world")
end
function errorhandle(str)
return string.upper(str)
end
- 例1,errfunc = 0
#include<iostream>
#include<string>
extern "C"{
#include<lua.h>
#include<lualib.h>
#include<lauxlib.h>
}
using namespace std;
int main(){
lua_State *L = lua_open();
luaopen_base(L);
luaopen_table(L);
luaopen_string(L);
if(luaL_loadfile(L,"luapcall.lua")){
cout << "open file error" << endl;
return 1;
}
//载入执行程序
if(lua_pcall(L,0,0,0)){
cout << "function call error 0" << endl;
}
lua_getglobal(L, "errorhandle");
lua_getglobal(L, "printmsg");
// errfunc = 0,不处理错误信息
if(lua_pcall(L, 0, 0, 0)){
cout << lua_tostring(L, -1) << endl;
cout << "function call error 1" << endl;
}
lua_close(L);
return 0;
}
执行结果:
-bash-3.00$ ./a.out
luapcall.lua:2: attempt to call global `printaa' (a nil value)
function call error 1
- 例2, errfunc != 0
#include<iostream>
#include<string>
extern "C"{
#include<lua.h>
#include<lualib.h>
#include<lauxlib.h>
}
using namespace std;
int main(){
lua_State *L = lua_open();
luaopen_base(L);
luaopen_table(L);
luaopen_string(L);
if(luaL_loadfile(L,"luapcall.lua")){
cout << "open file error" << endl;
return 1;
}
if(lua_pcall(L,0,0,0)){
cout << "function call error 0" << endl;
}
lua_getglobal(L, "errorhandle");
lua_getglobal(L, "printmsg");
// 使用errorhandle函数处理错误信息
if(lua_pcall(L, 0, 0, -2)){
cout << lua_tostring(L, -1) << endl;
cout << "function call error 1" << endl;
}
lua_close(L);
return 0;
}
执行结果:
-bash-3.00$ ./a.out
LUAPCALL.LUA:2: ATTEMPT TO CALL GLOBAL `PRINTAA' (A NIL VALUE)
function call error 1
lua_pcall与lua_call之间的区别的更多相关文章
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
- 你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别
要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...
- iOS中assign,copy,retain之间的区别以及weak和strong的区别
@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...
- javascrip中parentNode和offsetParent之间的区别
首先是 parentNode 属性,这个属性好理解,就是在 DOM 层次结构定义的上下级关系,如果元素A包含元素B,那么元素B就可以通过 parentElement 属性来获取元素A. 要明白 off ...
- 面试问题5:const 与 define 宏定义之间的区别
问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开: const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...
- 关于背景图相对父容器垂直居中问题 —— vertical-align 和 line-height 之间的区别
html css <div class="register-wrapper"> <div class="register"> &l ...
- 转:WCF、WebAPI、WCFREST、WebService之间的区别
WCF.WebAPI.WCFREST.WebService之间的区别 注明:转载 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API ...
- 深入理解 '0' "0" '\0' 0 之间的区别
看来基础还是很重要的,基础不扎实就难以学好c语言,就别说写出高质量的c语言代码了.今天,我就被这个问题折磨的不行了,哈哈,不过现在终于明白了‘\0’ ,‘0’, “0” 之间的区别了.困惑和快乐与你分 ...
随机推荐
- 入门 IT 行业,该具备哪些技能?
对于刚开始进入IT的新人来说,“必备技能”往往意味着一个长长的.标有重要度的学习列表,但是过长的列表通常会导致新人不知如何开始学习,压力倍增.本文尝试列举出最重要的几个技能,也期望通过此列表能给新人一 ...
- 错误:java.lang.IllegalArgumentException: Receiver not registered
Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.multak.cookaraclient.Mai ...
- Java中更精确的计时
我们一般的java运输计时代码是 long begintime = System.currentTimeMillis(); //运算代码 long endtinme=System.currentTim ...
- 腾讯测试工程师:你以为会打LOL就能做测试了?
周日参加完公司团建,回家路上拼到一个IT界的老司机,他和几个朋友组件团队承接开发项目,知道我是做测试的,问了我一个问题: “你们大公司的测试都做什么?” “测试应该不好模仿吧?” 刚开始我也不清楚他的 ...
- 记录sql执行顺序
SQL 语句执行顺序为: FROM WHERE GROUP BY HAVING SELECT DISTINCT UNION ORDER BY 关于 SQL 语句的执行顺序,有三个值得我们注意的地方: ...
- https://blog.csdn.net/sxf359/article/details/71082404
https://blog.csdn.net/sxf359/article/details/71082404
- URL回车后发生了什么
1.解析URL ________________________________________________________________________ 关于URL: URL(Universa ...
- 【BZOJ1396】识别子串 - 后缀自动机+线段树
题意: Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. 题解: ...
- 鸟哥的linux私房菜
http://vbird.dic.ksu.edu.tw/linux_basic/linux_basic.php
- 解决utf8' codec can't decode byte 0xe5 in position 0: unexpected end of data
使用unicode对象的话,除了这样使用u标记,还可以使用unicode类以及字符串的encode和decode方法. unicode类的构造函数接受一个字符串参数和一个编码参数,将字符串封装为一个u ...