lua pcall與lua call之間的區別

2022-08-28 23:18:25 字數 1706 閱讀 9626

定義:

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,...