Lua的pcall错误处理

#include "stdafx.h"
#include 
#include 
#include 
#include 

using namespace std;

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


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!!]
*/

你可能感兴趣的:(Lua)