Lua的pcall错误处理

#include "stdafx.h"
#include <windows.h>
#include <string>
#include <iostream>
#include <sstream>


using namespace std;


extern "C"
{
#include "lua.h"
#include "lualib.h"
#include <lauxlib.h>
};




int pcall_callback_err_fun(lua_State* L)
{
lua_Debug debug= {};
int ret = lua_getstack(L, 2, &debug); // 0是pcall_callback_err_fun自己, 1是error函数, 2是真正出错的函数
lua_getinfo(L, "Sln", &debug);


std::string err = lua_tostring(L, -1);
lua_pop(L, 1);
std::stringstream msg;
msg << debug.short_src << ":line " << debug.currentline;
if (debug.name != 0) {
msg << "(" << debug.namewhat << " " << debug.name << ")";
}


msg << " [" << err << "]";
lua_pushstring(L, msg.str().c_str());
return 1;
}


int main()
{
lua_State * L = luaL_newstate();    //创建lua运行环境
luaL_openlibs(L);
int ret = luaL_loadfile(L,"func.lua") ;       //加载lua脚本文件
ret = lua_pcall(L, 0, 0, 0);


lua_pushcfunction(L, pcall_callback_err_fun);
int pos_err = lua_gettop(L);
lua_getglobal(L,"f");               //调用lua中的函数f
ret = lua_pcall(L, 0, 1, pos_err) ;
if ( ret != 0 )
{
int t = lua_type(L, -1);
const char* err = lua_tostring(L,-1);
printf("Error: %s\n", err);
lua_pop(L, 1);
}
lua_close(L) ;   


return 0;
}


/*
-- func.lua
local function f_err()
print("f_err!");
-- 错误测试
error("error!!");
print("f_err!!");
return 0;
end


function f()
print("f!");
f_err();
print("f!!");
return 0;
end
print("Load OK!");
*/


/*
输出: 
Load OK!
f!
f_err!
Error: func.lua:line 5(upvalue f_err) [func.lua:5: error!!]
*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值