Skip to content

lua_pcall

保護モードで関数を呼び出します。エラーが発生した場合、エラーコードを返します。

[-(nargs + 1), +(nresults|1), -]

c
int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);

説明

保護モードで関数を呼び出します。

nargsnresultslua_callと同じ意味を持ちます。呼び出し中にエラーがなければ、lua_pcalllua_callと全く同じように振る舞います。しかし、エラーが発生した場合、lua_pcallはそれをキャッチし、スタックに単一の値(エラーメッセージ)をプッシュし、エラーコードを返します。lua_callと同様に、lua_pcallは常に関数とその引数をスタックから削除します。

errfuncが0の場合、スタックに返されるエラーメッセージは元のエラーメッセージと完全に同じです。それ以外の場合、errfuncはエラーハンドラ関数のスタックインデックスです。(現在の実装では、このインデックスは擬似インデックスにはなり得ません。)ランタイムエラーの場合、この関数はエラーメッセージと共に呼び出され、その返り値がlua_pcallによってスタックに返されるメッセージになります。

通常、エラーハンドラ関数はエラーメッセージにさらなるデバッグ情報(スタックトレースなど)を追加するために使用されます。このような情報はlua_pcallの戻り後には収集できません。その時点ではすでにスタックが巻き戻されています。

lua_pcall関数は成功の場合に0を返します。または以下のエラーコードのいずれか(lua.hで定義)を返します:

  • LUA_ERRRUN: ランタイムエラー。
  • LUA_ERRMEM: メモリ割り当てエラー。この種のエラーに対しては、Luaはエラーハンドラ関数を呼び出しません。
  • LUA_ERRERR: エラーハンドラ関数の実行中にエラーが発生しました。

サンプルコード

c
int status = lua_pcall(L, 2, 1, 0);
if (status != 0) {
    fprintf(stderr, "エラー: %s\n", lua_tostring(L, -1));
    lua_pop(L, 1);
}

このコードは、関数を保護モードで呼び出し、エラーが発生した場合にエラーメッセージを出力します。

互換性

  • Lua5.1

関連項目

  • lua_call
  • lua_cpcall