定義:
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_pcall errfunc的工作原理:
luapcall.lua
function printmsg()
--故意製造呼叫出錯
printaa("hello world")
endfunction errorhandle(str)
return string.upper(str)
end
#include#includeextern "c"
using namespace std;
int main()
//載入執行程式
if(lua_pcall(l,0,0,0))
lua_getglobal(l, "errorhandle");
lua_getglobal(l, "printmsg");
// errfunc = 0,不處理錯誤資訊
if(lua_pcall(l, 0, 0, 0))
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
#include#includeextern "c"
using namespace std;
int main()
if(lua_pcall(l,0,0,0))
lua_getglobal(l, "errorhandle");
lua_getglobal(l, "printmsg");
// 使用errorhandle函式處理錯誤資訊
if(lua_pcall(l, 0, 0, -2))
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 異常處理
assert 處理 local temp local result assert xyz error assert的第乙個引數為false,返回第乙個引數,否則返回第二個引數 捕獲異常 錯誤發生時,不希望 停止,做一些處理,用pcall捕獲異常 function func print tab 5 e...
SQL與NoSQL MySQL與NoSQL的融合
寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...
指標與陣列 a與 a區別
假設宣告了乙個陣列a,則 a表示陣列a的首位址,a與 a 0 表示陣列a首元素的首位址,那麼 a 1與a 1有哪些區別呢?通過下面的實驗來說明。int i 0 int a 5 int p int a 1 for i 0 i 5 i printf a 0x p,a 0x p,a 1 0x p n a,...