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