4.4 C のエラーハンドリング
Lua は内部で C の longjmp
を使ってエラーを処理します (Lua を C++ としてコンパイルした場合には例外が使われます。ソースコードを LUAI_THROW
で検索してください)。Lua がメモリアロケーションや型に関するエラーに直面すると、エラーの送出 (つまり longjmp
の実行) が行われます。保護された環境 (protected environment) に入るときに setjmp
で復帰点が設定され、エラーが起こると一番最近のアクティブな復帰点に実行が移ります。
C 関数では lua_error
を呼ぶことで明示的にエラーを送出できます。
大部分の API はエラーを送出する可能性があります。例えばメモリアロケーションに関するエラーです。以下の各関数のドキュメントには、送出される可能性のあるエラーが示されています。
保護された環境の外側でエラーが発生すると、Lua はパニック関数 (panic function) を呼び出し、さらに abort
を読んでホストアプリケーションを終了させます (パニック関数については lua_atpanic
を参照してください)。パニック関数を返さなければ終了を回避できます (Lua の外側にある復帰点に longjmp
するなど)。
パニック関数はその名の通り最後の手段を提供するための仕組みです。ホストプログラムはパニック関数の利用を避けるべきです。一般的な規則として、C 関数が Lua から Lua ステートと共に呼び出されたときには Lua ステートに対して何をしても構いません。C 関数が受け取る Lua ステートは保護されているはずだからです。一方で C コードが他の Lua ステート (例えば関数の引数として渡される Lua ステート、レジストリに保存された Lua ステート、lua_newthread
の返り値の Lua ステート) を操作する場合には、エラーを起こさない API だけを使う必要があります。
パニック関数はメッセージハンドラ (§ 2.3) であるかのように実行されます。具体的には、エラーオブジェクトがスタックの一番上に乗った状態で実行されます。ただしスタックの空間に関する保証はないので、パニック関数でスタックに何かをプッシュするときは利用可能な空間を最初に確認する必要があります (§ 4.1.1)。
4.4.1. 状態コード
エラーを報告する API 関数のうちいくつかは、次の状態コードを使って起きたエラーの種類を伝達します:
LUA_OK
(0): エラーは起きていない。LUA_ERRRUN
: ランタイムエラー。LUA_ERRMEM
: メモリアロケーションエラー。このエラーではメッセージハンドラは呼ばれない。LUA_ERRERR
: メッセージハンドラの実行中に起きたエラー。LUA_ERRSYNTAX
: 事前コンパイルにおける構文エラー。LUA_YIELD
: スレッド (コルーチン) が yield した。LUA_ERRFILE
: ファイルに関するエラー (ファイルのオープンあるいは読み取りに失敗した、など)。
これらの定数はヘッダーファイル lua.h
に定義されています。